2

使用 %Lf 打印时,较大的 double 值会更改 不超过以下组合的值会给出正确的结果 小数点前 9 位/小数点后 6 位 例如,使用 %Lf 打印的小数点前 9 位的值 输入:3435537287.32 输出:3435537287.320000

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

是否有任何用于 g++/xlc++ 的编译时选项可用于使值不会改变?

::代码片段::

double d2 =  34355372871.3487; 
double d4 =  3435537287.3487; 

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

谢谢,哈德森

4

3 回答 3

4

简短说明:您需要长双打

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 位。

于 2013-08-07T12:05:02.407 回答
1

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

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

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

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

于 2013-08-07T11:57:56.597 回答
0

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

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

于 2013-08-07T12:16:39.597 回答