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?