Virtually endless precision (C++ query)

Link to this post 17 Feb 10

I am new to C++ using GCC but the following program (print-out) gives very much more precision than the number of bytes allocated to a variable of (eg type float) 4 bytes ought to give and errno is always 0. Can anyone enlighten me as to why, please?

using namespace std;
#include <iostream>
#include <errno.h>
int main () {
float d=1; // 4bytes type - set i to 129 - result is 39 digits (:-o
// or try :-
//double d=1; // 8bytes type - set i to 1025 - 308 digits (:-O
// or try :-
//long double d=1; // 12bytes type - set i to 16385, - fails at i=16384 - 4932 digits? =(:-O
for (int i=1; i<129; i++) { d=d*2; cout<<"err="<<errno<<"\ti="<<i<<"\t"<<d<<"\n"; }
cout<<"\n"<< sizeof(d) <<" bytes is sizeof d\n\n";
return 0;}

[BTW:- how would i have inserted that as an image?]

Link to this post 17 Feb 10

It's a matter of understanding the difference between precision and range. The precision of a double is about 15 digits, but the range is E+-308. Ie, 1.2345678901234 x 10^308, or a 308 digit number. Anything after the trailing 4 is dubious, and is likely to be truncated. There are C and C++ libraries that support infinite-precision math, although with a serious performance penalty. FWIW, even particle physicists (of which my wife is one) only need floats (6 digits of precision) for most computations, though they use doubles in order to reduce rounding errors in complex equations.

Link to this post 19 Feb 10

But, Rubberman, the displayed digits are correct ! [as far as I can tell].
size of d is 4 bytes, the print-out is 39 digits.

Link to this post 27 Feb 10

Well, if this is integer math, and the FPU switches to a 64bit integer value, then it can handle numbers up to about 20 digits. If it used the internal 80bit register it has internally, then it could handle more, but not anywhere as many as you say you are getting. Honestly, unless the C++ compiler switches to some sort of infinite precision math package, such as Boost, I don't know why you would get some 12K digits of precision with a double.

Who we are ?

The Linux Foundation is a non-profit consortium dedicated to the growth of Linux.

More About the foundation...

Frequent Questions

Join / Linux Training / Board