Types 可以存储在double中的最大整数
在不损失精度的情况下,IEEE 754双精度类型中可以存储的最大“无浮点”整数是什么?1.7976931348623157×10^308Types 可以存储在double中的最大整数,types,floating-point,double,ieee-754,Types,Floating Point,Double,Ieee 754,在不损失精度的情况下,IEEE 754双精度类型中可以存储的最大“无浮点”整数是什么?1.7976931348623157×10^308 维基百科在相同的上下文中有这样一句话,链接到: 在典型的计算机系统上,“双精度”(64位)二进制浮点数的系数为53位(隐含其中一位),指数为11位,符号位为1位 2^53刚好超过9*10^15。存储在double中而不丢失精度的最大整数与double中可能的最大值相同。也就是说,DBL_MAX或大约1.8×10308(如果您的双精度是IEEE 754 64位双
维基百科在相同的上下文中有这样一句话,链接到: 在典型的计算机系统上,“双精度”(64位)二进制浮点数的系数为53位(隐含其中一位),指数为11位,符号位为1位
2^53刚好超过9*10^15。存储在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时。您需要查看尾数的大小。IEEE 754 64位浮点数(有52位,加上隐含的1位)可以精确表示绝对值小于或等于2^53的整数。9007199254740992(即9007199254740992),无任何保证:) 节目
#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;
}
#包括
#包括
内部主(空){
double dbl=0;/*我从90071992540000开始,略小于2^53*/
而(dbl+1!=dbl)dbl++;
printf(“%.0f\n”,dbl-1);
printf(“%.0f\n”,dbl);
printf(“%.0f\n”,dbl+1);
返回0;
}
结果
9007199254740991
9007199254740992
9007199254740992
9007199254740991
9007199254740992
9007199254740992
IEEE 754 double(64位)中可以表示的最大整数与该类型可以表示的最大值相同,因为该值本身就是一个整数 这表示为
0x7FEFFFFFFFFFFFFF
,由以下部分组成:
- 符号位0(正)而不是1(负)
- 最大指数
(2046表示减去偏差后的1023)而不是0x7FE
(2047表示0x7FF
或无穷大)NaN
- 最大尾数
,52位全部为10xFFFFFFFFFFFFF
这大约是1.8 x 10308。对于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的数字,正如其他人所指出的,我将假设OP要求最大的浮点值,这样所有小于自身的整数都可以精确表示 您可以使用
float.h
中定义的FLT\u MANT\u DIG
和DBL\u MANT\u DIG
不依赖显式值(例如53):
#包括
#包括
内部主(空)
{
printf(“%d,%.1f\n”),浮点数(1L这个答案最好加上一个引文。@Carl好吧,如果整数的左边有零,那么它就被精确地存储了。@1.7976931348623157×10^308是一个精确的整数。你们都需要参加数学补习班或其他什么吗?在讨论这个毫无希望的答案时,我们现在讨论的是语义学。诚然,这个数字可以准确地表示出来,从而满足了问题的要求。但我们都知道,这是一个在未遂事件海洋中的精确小岛,我们大多数人都正确地将这个问题插入到“最大的数字,超过这个数字,精确性将付诸东流”啊,CompSci是一门精确的科学,这不是很奇妙吗?:)@DanMoulding 1.7976931348623157×10^308是一个精确的整数,但我很确定这个特定的整数不能精确地存储在一个双精度中。它也可以精确地表示2^53:-)+1注意到问题并不是询问者真正想要的,并提供两个答案(“技术正确”和“可能经验”),这很好
24, 16777216.0
53, 9007199254740992.0