This code:
double x = 2.0;
for(int i = 1 ; i<1024 ; i+=i) {
Console.WriteLine( String.Format( "2^{0} = {1:F0}", i, x ) );
x*=x;
}
Outputs:
2^1 = 2
2^2 = 4
2^4 = 16
2^8 = 256
2^16 = 65536
2^32 = 4294967296
2^64 = 18446744073709600000
2^128 = 340282366920938000000000000000000000000
2^256 = 115792089237316000000000000000000000000000000000000000000000000000000000000000
2^512 = 13407807929942600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
I thought that double's formula is sign * 2 ^ exponent * fraction
; To Illustrate my situation; With setting the fraction
to 0.5
, the sign to positive, and by setting exponent
to any value between -1024
to 1023
, I can present any 2^n
number that is in the exponent
's range; What is wrong with this deduction? Is the formula incomplete?
A
double
can represent powers of 2 exactly, as demonstrated by the following code (which uses Jon Skeet'sDoubleConverter
class):For the F0 specifier, why did the .NET designers choose to round the value off after the 15 most significant decimal digits?
My guess: Displaying the exact value (such as 18446744073709551616) might imply that the
double
is precise to all those digits, when in fact adouble
cannot distinguish between that value and 18446744073709600000. Also, displaying a rounded value is consistent with exponential notation: 1.84467440737096E+19.