你有多大的数字可以存储在double中并浮动在c中?

Jin*_*kim 4 c floating-point sizeof

我想弄清楚我可以使用多少大数字作为浮点数和double.但它不存储我预期的方式,除了整数值.double应该保存8个字节的信息,足以容纳变量a,但它不能保持正确.它显示1234567890123456768最后2位数字不同.当我214783648在float变量的最后一位存储或任何数字时b,它显示相同的值214783648.这应该是极限.发生什么了?

double a;
float b;
int c;
a = 1234567890123456789;
b = 2147483648;
c = 2147483647;
printf("Bytes of double: %d\n", sizeof(double));
printf("Bytes of integer: %d\n", sizeof(int));
printf("Bytes of float: %d\n", sizeof(float));

printf("\n");

printf("You can count up to %.0f in 4 bytes\n", pow(2,32));
printf("You can count up to %.0f with + or - sign in 4 bytes\n", pow(2,31));
printf("You can count up to %.0f in 4 bytes\n", pow(2,64));
printf("You can count up to %.0f with + or - sign in in 8 bytes\n", pow(2,63));

printf("\n");

printf("double number: %.0f\n", a);
printf("floating point: %.0f\n", b);
printf("integer: %d\n", c);

return 0;
Run Code Online (Sandbox Code Playgroud)

Ark*_*kku 8

关于什么是可以存储在浮点类型中的最大(有限)数的问题的答案将分别是FLT_MAX或者DBL_MAX用于floatdouble.

但是,这并不意味着该类型可以精确地表示每个较小的数字或整数(事实上,甚至不接近).

首先,您需要了解浮点数的所有位都不是"相等".浮点数具有指数(8位IEEE-754标准float,11位double)和尾数(分别为23和52位float,double分别为).通过将尾数(具有隐含的前导1位和二进制点)乘以2 指数(在对指数进行归一化之后;其二进制值不直接使用)来获得该数字.还有一个单独的符号位,因此以下内容也适用于负数.

随着指数改变,尾数的连续值之间的距离也改变,即,指数越大,浮点数的连续可表示值越.因此,您可以精确地存储给定幅度的一个数字,但不能存储"下一个"数字.人们还应该记住,一些看似简单的分数不能用任意数量的二进制数字精确表示(例如,1/10十分之一,是二进制的无限重复序列,如1/3三分之一,十进制).

当涉及到整数时,您可以精确地表示最多2个尾数_位+ 1个幅度的每个整数.因此,IEEE-754 float可以表示最多2 24double最多2 53的所有整数(在这些范围的后半部分中,连续浮点值恰好是一个整数,因为整个尾数仅用于整数部分) .有迹象表明,可以表示单独的更大的整数,但它们相互隔开一个以上的整数,即,可以代表一些整数大于2个mantissa_bits + 1,但整数只到该幅度.

例如:

float f = powf(2.0f, 24.0f);
float f1 = f + 1.0f, f2 = f1 + 2.0f;
double d = pow(2.0, 53.0);
double d1 = d + 1.0, d2 = d + 2.0;
(void) printf("2**24 float = %.0f, +1 = %.0f, +2 = %.0f\n", f, f1, f2);
(void) printf("2**53 double = %.0f, +1 = %.0f, +2 = %.0f\n", d, d1, d2);
Run Code Online (Sandbox Code Playgroud)

输出:

2**24 float = 16777216, +1 = 16777216, +2 = 16777218
2**53 double = 9007199254740992, +1 = 9007199254740992, +2 = 9007199254740994
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,添加1到2个mantissa_bits + 1没有任何区别,因为结果不可表示,但是添加2确实产生了正确的答案(因为在这个数量上,可表示的数字是两个整数,因为乘数已加倍).

 

TL; DR IEE-754 float可以精确地表示高达2 24double高达2 53的所有整数,但只有一些更大的整数(可表示值的间距取决于幅度).


Yu *_*Hao 7

sizeof(double)是的8,是的,但也double需要一些位来存储指数部分.

假设使用IEEE-754,则double可以精确地表示最多为2 53的整数,这小于1234567890123456789.

另请参见双精度浮点格式.


blu*_*112 3

您可以使用常量来了解限制是什么:

FLT_MAX
DBL_MAX
LDBL_MAX
Run Code Online (Sandbox Code Playgroud)

来自 CPP 参考

  • 这不是答案。`1234567890123456789` 比 `DBL_MAX` 小很多,通常是 `1E+37`。这个问题的真正问题不是“double”可以存储的最大数字,而是“double”可以精确地存储多大的整数。 (3认同)
  • 请记住,它们取决于平台、操作系统、编译器和编译选项。 (2认同)
  • @Olaf **更正**我之前的评论:“DBL_MAX”的“最小”可接受值为“1E+37”。它通常要大得多,比如“1.79769e+308”。 (2认同)