双精度误差

时间:2013-08-07 11:42:27

标签: c++ g++ xlc

使用%Lf打印时会更改大的double值 达到以下组合的值会给出正确的结果 十进制前9位数/小数后6位数 例如使用%Lf打印的小数点前9位数的值 输入:3435537287.32 产量:3435537287.320000

一旦我将小数点前的数字增加到10,用%Lf打印的值会增加垃圾值。 例如使用%Lf打印的小数点前10位数的值 输入:34355372871.3487 产量:34355372871.348701 从上面的输出中可以看出输入值已更改。

是否有可用于g ++ / xlc ++的编译时选项,以便该值不会被更改?

:: Code Snippet ::

double d2 =  34355372871.3487; 
double d4 =  3435537287.3487; 

printf("d2 = %lf\n", d2); 
printf("d4 = %lf\n", d4); 

谢谢, 哈德森

3 个答案:

答案 0 :(得分:2)

简短说明:你需要长双打

long double d2 =  34355372871.3487L; 
long double d4 =  3435537287.3487L; 

printf("d2 = %Lf\n", d2); 
printf("d4 = %Lf\n", d4);

很长的解释:你的意义占据了很大的空间;-) 以下是浮点值中使用的位。

//Type       Sign  Exponent Significand Total bit 
//Double        1        11          52        64 
//Long Double   1        15          64        80

请记住,十进制中的每个数字大约需要3.3位(log(10)/ log(2)) 所以52位/3.3~15-16位。

答案 1 :(得分:1)

这是双精度。双精度存储为64位(8字节)。

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

它使用52位作为尾数,1位用于信号,11位用于指数。

然后,52位尾数给出15-17有效十进制数字精度。

答案 2 :(得分:0)

由于浮点数的精度有限,并非每个(或实际上只有几个)十进制浮点文字都与现有的二进制表示完全对应。

每个文字都映射到最接近的现有值。对于每个浮点类型都会发生这种情况,但对于更高精度类型,它会更不明显,因为有更多不同的数字。