float 类型可以容纳的最大数字是多少?

what's the largest number float type can hold?

我是编程新手,最近想到了这个简单的问题。 float 类型有 32 位,其中 8 位用于整数部分(尾数)。 所以我的问题是 float 类型可以容纳大于 255.9999 的数字吗?

如果有人告诉我为什么这段代码表现异常,我将不胜感激。是相关问题吗?

int main(){
float a=123456789.1;
printf("%lf",a);
return 0;
}

输出为:

123456792.000000

what's the largest number [the] float type can hold?

C 标准defines:

FLT_MAX

包括 <float.h> 使其成为 #defined.

<float.h> -- Numeric limits of floating point types 有您的答案,特别是...

  • FLT_MAX
  • DBL_MAX
  • LDBL_MAX

maximum finite value of float, double and long double respectively

...和...

  • FLT_DIG
  • DBL_DIG
  • LDBL_DIG

number of decimal digits that are guaranteed to be preserved in text -> float/double/long double -> text roundtrip without change due to rounding or overflow

最后一部分的意思是说 floatFLT_DIG 更长(即更多有效数字)的值不再保证可以精确表示。

最常见的 32 位浮点格式,IEEE-754 binary32,整数部分没有八位。它有一位用于符号,8 位用于指数字段,23 位用于尾数字段(小数部分)。

符号位决定数字是正数(0)还是负数(1)。

指数字段 e 有多种用途。如果它是 11111111(二进制),并且尾数字段 f 为零,则浮点值表示无穷大。如果 e 为 11111111,且尾数字段不为零,则表示一个特殊的非数字“值”。

若指数不为11111111且不为零,则浮点数表示2e−127•(1+f/223 ), 添加了符号。请注意,小数部分是通过将有效位字段的内容加 1 形成的。这通常被称为隐式 1,因此数学有效数是 24 位——前导 1 中的 1 位,有效数字段中的 23 位。

如果指数为零,浮点数表示21−127•(0+f/223 ) 或者如果符号位为 1 则为负数。请注意前导位为 0。这些称为次正规数。它们包含在格式中以使某些数学属性在浮点运算中起作用。

表示的最大有限值是当指数为11111110(254)且尾数位全为1时(f为223−1),所以表示的数为2254−127•(1+ (223−1)/223) = 2 127•(2−2−23) = 2128−2104 = 340282346638528859811704183484516925440.

float a=123456789.1; 中,float 类型没有足够的精度来表示 123456789.1。 (实际上,小数 .1 永远不能用二进制浮点格式表示。)当我们只有 24 位的有效数字时,我们可以表示的最接近 123456789.1 的数字是 123456792 和 123456800。