Fra*_*ger 208 floating-point double types ieee-754
什么是最大的"非浮动"整数,可以存储在IEEE 754 double类型而不会丢失精度?
Ste*_*sop 477
可以存储在double中而不会丢失精度的最大/最大整数与double的最大可能值相同.也就是说,DBL_MAX或大约1.8×10 308(如果你的双倍是IEEE 754 64位双倍).这是一个整数.它完全代表了.你还想要什么?
继续,问我最大的整数是什么,这样它和所有较小的整数都可以存储在IEEE 64位双精度而不会丢失精度.IEEE 64位双尾有52位尾数,所以我认为它是2 53:
或者另一种看待它的方法:一旦偏离指数被取消,并忽略符号位与问题无关,则double存储的值是2的幂,加上52位整数乘以2 指数 - 52.因此,使用指数52,您可以存储从2 52到2 53 - 1的所有值.然后使用指数53,您可以在2 53之后存储的下一个数字是2 53 + 1×2 53 - 52.因此,精度损失首先发生在2 53 + 1.
pmg*_*pmg 70
9007199254740992(即9,007,199,254,740,992)无保证:)
程序
#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;
}
Run Code Online (Sandbox Code Playgroud)
结果
9007199254740991 9007199254740992 9007199254740992
Sim*_*ber 16
可以在IEEE 754 double(64位)中表示的最大整数与该类型可以表示的最大值相同,因为该值本身是整数.
这表示为0x7FEFFFFFFFFFFFFF:由以下部分组成:
0x7FE(2046表示减去偏差后的1023)而不是0x7FF(2047表示a NaN或无穷大).0xFFFFFFFFFFFFF是52位全1.在二进制中,值是隐式1,后跟来自尾数的另外52个,然后是指数的971个零(1023 - 52 = 971).
确切的十进制值是:
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
这大约是1.8 x 10 308.
你需要看一下尾数的大小.IEEE 754 64位浮点数(具有52位,加上1隐含)可以精确地表示绝对值小于或等于2 ^ 53的整数.
1.7976931348623157×10 ^ 308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
确实,对于 64 位 IEEE754 double,可以精确表示 9007199254740992 == 2^53 以内的所有整数。
然而,还值得一提的是,所有超出 4503599627370496 == 2^52 的可表示数字都是整数。超过 2^52 时,测试它们是否是整数就变得毫无意义,因为它们都隐式舍入到附近的可表示值。
在 2^51 到 2^52 范围内,唯一的非整数值是以“.5”结尾的中点,这意味着计算后的任何整数测试都必须预期会产生至少 50% 的错误答案。
在 2^51 以下,我们还有“.25”和“.75”,因此将数字与其四舍五入的对应数字进行比较以确定它是否可能是整数开始有意义。
TLDR:如果要测试计算结果是否为整数,请避免大于 2251799813685248 == 2^51 的数字