Welcome to the Linux Foundation Forum!

Virtually endless precision (C++ query)

Options

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 () {
cout.precision(9999);
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?]

Comments

  • woboyle
    woboyle Posts: 501
    Options
    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.
  • Noluk
    Noluk Posts: 7
    Options
    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.
  • woboyle
    woboyle Posts: 501
    Options
    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.
  • Noluk
    Noluk Posts: 7
    Options
    the answer is here

Categories

Upcoming Training