打印一些双打时,我得到了意想不到的结果。有些四舍五入,我不知道为什么。
#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,如果之后没有数字。 在第二种情况下,我也不知道为什么数百个位置的数字被四舍五入。双打应该容纳比这些更大的数字而不用舍入。 感谢
答案 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位左右的精度十进制数字 - 你只是达到了数据类型的精度限制