GSL sample: View and Control IEEE754 floating-point arithmetic

Last Update: Oct. 4, 2007


Sample code

ieee754fp.c

/***********************************************/
/* T.Kouya's GSL sample program collection     */
/*        View and control                     */
/*           IEEE754 floating-point arithmetic */
/*                   Written by Tomonori Kouya */
/*                                             */
/* Version 0.01: 2007-10-04                    */
/***********************************************/
#include <stdio.h>
#include <math.h>
#include <fenv.h> // since C99
#include <gsl/gsl_ieee_utils.h>

int main(void)
{
	double a, b = cos(1.0 / 10.0), c = sin(1.0 / 11.0);

	printf("b -> Decimal = %25.17e\n", b);
	printf("     Binary  =  ");
	gsl_ieee_printf_double(&b);
	printf("\n");
	printf("c -> Decimal = %25.17e\n", c);
	printf("     Binary  =  ");
	gsl_ieee_printf_double(&c);
	printf("\n\n");

	/* setup ronding mode */
	/* set IEEE754 double precition floating-point number */
	printf("-- Round to -Infinity\n");
	fesetround(FE_DOWNWARD); // Round to -Infinity
	a = b + c;
	printf("b + c -> Decimal = %25.17e\n", a);
	printf("	 Binary  =  ");
	gsl_ieee_printf_double(&a);
	printf("\n\n");

	printf("-- Round to +Infinity\n");
	fesetround(FE_UPWARD); // Round to +Infinity
	a = b + c;
	printf("b + c -> Decimal = %25.17e\n", a);
	printf("	 Binary  =  ");
	gsl_ieee_printf_double(&a);
	printf("\n\n");

	printf("-- Round to Zero\n");
	fesetround(FE_TOWARDZERO); // Round to Zero
	a = b + c;
	printf("b + c -> Decimal = %25.17e\n", a);
	printf("	 Binary  =  ");
	gsl_ieee_printf_double(&a);
	printf("\n\n");

	printf("-- Round to Nearest (default)\n");
	fesetround(FE_TONEAREST); // Round to Nearest (default)
	a = b + c;
	printf("b + c -> Decimal = %25.17e\n", a);
	printf("	 Binary  =  ");
	gsl_ieee_printf_double(&a);
	printf("\n\n");

	return 0;
}

Example execution

$ ./ieee754fp
b -> Decimal =   9.95004165278025821e-01
     Binary  =   1.1111110101110001001011111001101010000001011111000001*2^-1
c -> Decimal =   9.07839235088703650e-02
     Binary  =   1.0111001111011001110101111110011110010010000101000011*2^-4

-- Round to -Infinity
b + c -> Decimal =   1.08578808878689603e+00
         Binary  =   1.0001010111110110001101010100101110111001110111110100*2^0

-- Round to +Infinity
b + c -> Decimal =   1.08578808878689625e+00
         Binary  =   1.0001010111110110001101010100101110111001110111110101*2^0

-- Round to Zero
b + c -> Decimal =   1.08578808878689603e+00
         Binary  =   1.0001010111110110001101010100101110111001110111110100*2^0

-- Round to Nearest (default)
b + c -> Decimal =   1.08578808878689625e+00
         Binary  =   1.0001010111110110001101010100101110111001110111110101*2^0

<- Go back