使用%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);
谢谢, 哈德森
答案 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)
由于浮点数的精度有限,并非每个(或实际上只有几个)十进制浮点文字都与现有的二进制表示完全对应。
每个文字都映射到最接近的现有值。对于每个浮点类型都会发生这种情况,但对于更高精度类型,它会更不明显,因为有更多不同的数字。