Listing 2 A precision problem uncovered

// The computer lie.
// Joe McCarty
// The problem with expressing an infinite
// quantity of numbers in a finite machine.
// Look at the program and predict the results.
// Then try running the program.

#include <stdio.h>
#include <math.h>

void test(int flag){
double x=4.999999999;
int exp=0;
printf("x= %20.18f\n",x);          //The original number
while(x<1000,0){x=x*10.0;exp--;}   //Adjust for truncation
                             //tion or rounding
while(x>10000.0) {x=x/10;exp++;}
if(flag)x=(double)(int)x;         //Truncate
if(!flag)x=(double)(int)(x+.5);   //Round
printf("x=%20.18f\n",x);          //Show result
x=x*pow(10.0.exp);                //Back to original
                            //exponent
printf("x= %20.18f\n\n",x);        //Show result
}//end test

void main(){
 test(0);
 test (1);
}//end main

/*
x= 4.999999998999999920
x= 5000.000000000000000000
x= 5.000000000000000000

x= 4.999999998999999920
x= 4999.000000000000000000
x= 4.998999999999999670
*/