如果浮点常量隐式转换为int类型,何时会溢出

时间:2019-06-07 16:53:46

标签: c implicit-conversion

我有两个代码段,并且都产生不同的结果。我正在使用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常量溢出造成的吗?

1 个答案:

答案 0 :(得分:5)

(此回答仅限于IEEE754)。

当您将常数分配给浮点时,IEEE754标准要求选择最接近个可能的浮点数。您提供的两个数字都无法准确表示。

距离2.999999999999999最近的IEEE754双精度浮点数 是2.99999999999999911182158029987476766109466552734375,而最接近2.9999999999999999的是3

因此输出。转换为整数类型会将值截断为零。

使用round是避免这种影响的一种方法。

进一步阅读:Is floating point math broken?