fma*_*att 0 c floating-point types limit
我是编程新手,最近提出了这个简单的问题。float 类型有 32 位,其中 8 位用于整数部分(尾数)。所以我的问题是 float 类型可以容纳大于 255.9999 的数字吗?
如果有人告诉我为什么这段代码的行为异常,我也将不胜感激。这是一个相关的问题吗?
int main(){
float a=123456789.1;
printf("%lf",a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其输出为:
123456792.000000
Run Code Online (Sandbox Code Playgroud)
<float.h>
-- 浮点类型的数值限制有你的答案,特别是......
- 最大FLT
- 最大DBL_MAX
- LDBL_MAX
float
、double
和long double
的最大有限值
...和...
- FLT_DIG
- DBL_DIG
- LDBL_DIG
保证在文本中保留的小数位数 ->
float
// -> 文本往返,不会因舍入或溢出而发生double
变化long double
最后一部分的意思是,float
更长的值(即更高的有效数字)FLT_DIG
不再保证可以精确表示。
最常见的 32 位浮点格式,IEEE-754二进制32整数部分没有八位。它有 1 位用于符号,8 位用于指数字段,23 位用于尾数字段(小数部分)。
\n符号位决定数字是正数 (0) 还是负数 (1)。
\n指数域 e 有多种用途。如果它是 11111111(二进制),并且尾数字段 f 为零,则浮点值表示无穷大。如果 e 为 11111111,且尾数字段不为零,则表示特殊的非数字 \xe2\x80\x9cvalue\xe2\x80\x9d。
\n如果指数不是 11111111 且不为零,则浮点值表示 2 e\xe2\x88\x92127 \xe2\x80\xa2(1+f/2 23 ),并添加符号。请注意,小数部分是通过将有效数字段的内容加 1 形成的。这通常被称为隐式 1,因此数学有效数是距前导 1 24 位\xe2\x80\x941 位,距有效数字段 23 位。
\n如果指数为零,则浮点值表示 2 1\xe2\x88\x92127 \xe2\x80\xa2(0+f/2 23 ) 或如果符号位为 1,则表示其负数。注意前导位是 0。这些称为次正规数。它们包含在格式中以使某些数学属性适用于浮点算术。
\n表示的最大有限值是当指数为 11111110 (254) 且尾数字段为全 1 时(f 为 2 23 \xe2\x88\x921),因此表示的数字为 2 254\xe2\x88\x92127 \xe2\ x80\xa2(1+ (2 23 \xe2\x88\x921)/2 23 ) = 2 127 \xe2\x80\xa2(2\xe2\x88\x922 \xe2\x88\x9223 ) = 2 128 \xe2\ x88\x922 104 = 340282346638528859811704183484516925440。
\n在float a=123456789.1;
里面float
类型没有足够的精度来表示 123456789.1。(事实上,小数 0.1 永远无法用二进制浮点格式表示。)当有效数只有 24 位时,我们可以表示的最接近 123456789.1 的数字是 123456792 和 123456800。