可以存储在IEEE 754双类型中而不损失精度的最大“无浮动”整数是多少?
换句话说,at会返回以下代码片段:
UInt64 i = 0;
Double d = 0;
while (i == d)
{
i += 1;
d += 1;
}
Console.WriteLine("Largest Integer: {0}", i-1);
可以存储在IEEE 754双类型中而不损失精度的最大“无浮动”整数是多少?
换句话说,at会返回以下代码片段:
UInt64 i = 0;
Double d = 0;
while (i == d)
{
i += 1;
d += 1;
}
Console.WriteLine("Largest Integer: {0}", i-1);
当前回答
9007199254740992(即9,007,199,254,740,992或2^53),没有保证:)
程序
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
结果
9007199254740991 9007199254740992 9007199254740992
其他回答
9007199254740992(即9,007,199,254,740,992或2^53),没有保证:)
程序
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
结果
9007199254740991 9007199254740992 9007199254740992
维基百科在同样的背景下引用了IEEE 754的链接:
在典型的计算机系统中,“双精度”(64位)二进制浮点数的系数为53位(其中一个是隐含的),指数为11位,以及一个符号位。
2^53略大于9 * 10^15。
1.7976931348623157 × 10^308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
你得看看尾音的大小。IEEE 754 64位浮点数(包含52位,加1)可以精确地表示绝对值小于或等于2^53的整数。
可以存储在double类型中而不损失精度的最大/最大整数与double类型的最大可能值相同。即DBL_MAX或大约1.8 × 10308(如果您的双精度是IEEE 754 64位双精度)。它是一个整数。它被准确地表示出来了。你还想要什么?
继续,问我最大的整数是多少,这样它和所有更小的整数都可以存储在IEEE 64位双精度中而不损失精度。IEEE 64位双精度数有52位尾数,所以我认为是253:
253 + 1不能被存储,因为开头的1和结尾的1之间有太多的零。 任何小于253的数都可以存储,52位显式存储在尾数中,然后指数实际上会给你另一个。 253显然可以存储,因为它是2的小幂。
或者另一种看待它的方式:一旦偏离指数,忽略与问题无关的符号位,double存储的值是2的幂,加上一个52位整数乘以2exponent−52。因此,指数52可以存储从252到253−1的所有值。对于指数53,253之后可以存储的下一个数字是253 + 1 × 253−52。所以精度损失首先发生在253 + 1。