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>
使其成为 #define
d.
<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
最后一部分的意思是说 float
比 FLT_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。
我是编程新手,最近想到了这个简单的问题。 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>
使其成为 #define
d.
<float.h>
-- Numeric limits of floating point types 有您的答案,特别是...
- FLT_MAX
- DBL_MAX
- LDBL_MAX
maximum finite value of
float
,double
andlong 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
最后一部分的意思是说 float
比 FLT_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。