可以存储在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);
当前回答
正如其他人所指出的,我将假设OP要求最大的浮点值,以便所有小于其本身的整数都可以精确表示。
你可以使用float.h中定义的FLT_MANT_DIG和DBL_MANT_DIG来不依赖于显式值(例如,53):
#include <stdio.h>
#include <float.h>
int main(void)
{
printf("%d, %.1f\n", FLT_MANT_DIG, (float)(1L << FLT_MANT_DIG));
printf("%d, %.1lf\n", DBL_MANT_DIG, (double)(1L << DBL_MANT_DIG));
}
输出:
24, 16777216.0
53, 9007199254740992.0
其他回答
1.7976931348623157 × 10^308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
你得看看尾音的大小。IEEE 754 64位浮点数(包含52位,加1)可以精确地表示绝对值小于或等于2^53的整数。
在IEEE 754 double(64位)中可以表示的最大整数与该类型可以表示的最大值相同,因为该值本身就是一个整数。
这表示为0x7FEFFFFFFFFFFFFF,它由:
符号位0(正)而不是1(负) 最大指数0x7FE(2046表示减去偏差后的1023)而不是0x7FF(2047表示NaN或无穷大)。 最大尾数0xFFFFFFFFFFFFF是52位全1。
在二进制中,值是隐式的1,后面是尾数中的另外52个1,然后是指数中的971个0(1023 - 52 = 971)。
精确的十进制值为:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464 234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559 332123348274797826204144723168738177180919299881250404026184124858368
这大约是1.8 x 10308。
的确,对于64位的IEEE754双精度,所有到9007199254740992 == 2^53的整数都可以精确表示。
然而,值得一提的是,所有超出4503599627370496 == 2^52的可表示数字都是整数。 超过2^52,测试它们是否是整数就没有意义了,因为它们都隐式舍入到附近一个可表示的值。
在2^51到2^52的范围内,唯一的非整数值是以“”结尾的中点。5”,这意味着计算后的任何整数测试都必须产生至少50%的错误答案。
在2^51以下也有"25"和"。75英寸,所以比较一个数字和它的四舍五入的对应数字,以确定它是否可能是整数开始是有意义的。
TLDR:如果您想测试计算结果是否可能是整数,请避免大于2251799813685248 == 2^51的数字
维基百科在同样的背景下引用了IEEE 754的链接:
在典型的计算机系统中,“双精度”(64位)二进制浮点数的系数为53位(其中一个是隐含的),指数为11位,以及一个符号位。
2^53略大于9 * 10^15。