【问题标题】:When does a float constant overflow if it is implicitly converted to int type如果浮点常量隐式转换为 int 类型,什么时候会溢出
【发布时间】:2019-06-07 16:53:46
【问题描述】:

我有两个代码 sn-ps 并且都产生不同的结果。我正在使用 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 常量中的一些溢出,如果是,它是如何发生的?

【问题讨论】:

  • @ThomasJager 不。该问题仅讨论浮点算术而不是类型转换为 int。
  • 它将浮点数表示为最接近的可表示值。
  • @ThomasJager 感谢您的提及
  • 注意:2.9999999999999992.9999999999999999 都是 'double' 值,而不是 'float' 要使它们成为 'float',它们应该写成:2.999999999999999f2.9999999999999999f 注意尾随'F'。因此,您实际上使用的是 double 值,而不是 float

标签: c implicit-conversion


【解决方案1】:

(将此答案限制为 IEEE754)。

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

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

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

使用round 是消除这种影响的一种方法。

延伸阅读:Is floating point math broken?

【讨论】:

  • 感谢您的回答。
  • @Alagusankar:很高兴,但也要研究参考答案。围绕浮点类型有很多误解。
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2021-01-02
  • 2021-05-15
相关资源
最近更新 更多