Types 可以存储在double中的最大整数

Types 可以存储在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位双

在不损失精度的情况下,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位双精度)。这是一个整数。它被精确地表示出来。你还想要什么

继续,问我最大的整数是什么,这样它和所有较小的整数都可以存储在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(负)
  • 最大指数
    0x7FE
    (2046表示减去偏差后的1023)而不是
    0x7FF
    (2047表示
    NaN
    或无穷大)
  • 最大尾数
    0xFFFFFFFFFFFFF
    ,52位全部为1
在二进制中,值是隐式的1,后面是尾数的52个1,然后是指数的971个零(1023-52=971)

精确的十进制值为:

1797693134862315708145274237170435679080707056556752584449965989174768031572607800828537605895586327668781715404589535143824642343213268894641822768467546703551698604991057655128207624549003893289440758584551339444583236903222981658085332334827479262627474727231687381771809192998840402848568


这大约是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