为什么我的指数数字被舍入? (C语言)

时间:2012-01-31 20:56:49

标签: c

打印一些双打时,我得到了意想不到的结果。有些四舍五入,我不知道为什么。

#include <stdio.h>

int main(void)
{
double d1 = 0;
double d2 = 0;

d1 = 1.2345678901234567e16;
d2 = 112233445566778899.0;

printf("d1: %.0lf\n", d1);
printf("d2: %.0lf\n", d2);

return 0;
}

运行程序的结果是:

d1: 12345678901234568
d2: 112233445566778900

在第一种情况下,我不确定为什么最后一位数字(7)被舍入为8,如果之后没有数字。 在第二种情况下,我也不知道为什么数百个位置的数字被四舍五入。双打应该容纳比这些更大的数字而不用舍入。 感谢

4 个答案:

答案 0 :(得分:3)

不是“大得多” - 实际上你正处于“准确性”的极限。双精度具有53位精度。你的第一个数字约为10 ^ 16,这需要 16 /(log 2)= 53.15位才能精确到整数。

答案 1 :(得分:3)

“双打应该容纳比这些更大的数字,而不是四舍五入。”你为什么这么认为?

IEEE标准double(您正在使用的)具有53位(二进制数字)的精度。

前往Wolfram Alpha并询问the binary representation of 12345678901234567。它会告诉你二进制表格有54位数字。因此,它无法准确表示为double

您的第二个号码需要57个数字,因此也无法准确表示。

答案 2 :(得分:2)

Doubles should accomodate numbers much larger than these without rounding - 是的,如果它们是2的幂。如果在二进制表示中最左边和最右边1之间有一个很大的距离,它们将被舍入。

答案 3 :(得分:1)

64位双精度只有16位左右的精度十进制数字 - 你只是达到了数据类型的精度限制