float常量隐式转换为int类型什么时候会溢出
When does a float constant overflow if it is implicitly converted to int type
我有两个代码片段,都产生了不同的结果。我使用的是 TDM-GCC 4.9.2 编译器,我的编译器是 32 位版本
( int 的大小是 4 个字节,float 的最小值是 -3.4e38 )
代码 1:
int x;
x=2.999999999999999; // 15 '9s' after decimal point
printf("%d",x);
输出:
2
代码 2:
int x;
x=2.9999999999999999; // 16 '9s' after decimal point
printf("%d",x);
输出:
3
为什么隐式转换在这些情况下不同?
是否由于指定的 Real 常量发生溢出?如果是,那是怎么发生的?
(将此答案限制为 IEEE754)。
当您将常量分配给浮点数时,IEEE754 标准要求选择最接近 可能的浮点数。您提供的两个数字都不能准确表示。
最接近 2.999999999999999
的 IEEE754 双精度浮点数
是 2.99999999999999911182158029987476766109466552734375
而最接近 2.9999999999999999
的是 3
.
因此输出。转换为整数类型会将值截断为零。
使用 round
是避免这种影响的一种方法。
进一步阅读:Is floating point math broken?
我有两个代码片段,都产生了不同的结果。我使用的是 TDM-GCC 4.9.2 编译器,我的编译器是 32 位版本
( int 的大小是 4 个字节,float 的最小值是 -3.4e38 )
代码 1:
int x;
x=2.999999999999999; // 15 '9s' after decimal point
printf("%d",x);
输出:
2
代码 2:
int x;
x=2.9999999999999999; // 16 '9s' after decimal point
printf("%d",x);
输出:
3
为什么隐式转换在这些情况下不同?
是否由于指定的 Real 常量发生溢出?如果是,那是怎么发生的?
(将此答案限制为 IEEE754)。
当您将常量分配给浮点数时,IEEE754 标准要求选择最接近 可能的浮点数。您提供的两个数字都不能准确表示。
最接近 2.999999999999999
的 IEEE754 双精度浮点数
是 2.99999999999999911182158029987476766109466552734375
而最接近 2.9999999999999999
的是 3
.
因此输出。转换为整数类型会将值截断为零。
使用 round
是避免这种影响的一种方法。
进一步阅读:Is floating point math broken?