我有两个代码段,并且都产生不同的结果。我正在使用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常量溢出造成的吗?
答案 0 :(得分:5)
(此回答仅限于IEEE754)。
当您将常数分配给浮点时,IEEE754标准要求选择最接近个可能的浮点数。您提供的两个数字都无法准确表示。
距离2.999999999999999
最近的IEEE754双精度浮点数
是2.99999999999999911182158029987476766109466552734375
,而最接近2.9999999999999999
的是3
。
因此输出。转换为整数类型会将值截断为零。
使用round
是避免这种影响的一种方法。