【问题标题】:Casting float to int inconsistent across MinGw and Clang在 MinGw 和 Clang 中将 float 转换为 int 不一致
【发布时间】:2016-08-21 10:35:25
【问题描述】:

使用 C++,我正在尝试使用以下说明将 float 值转换为 int

#include <iostream>

int main() {
    float NbrToCast = 1.8f;
    int TmpNbr = NbrToCast * 10;
    std::cout << TmpNbr << "\n";
}

我了解1.8 的值不能精确表示为float,实际上存储为1.79999995

因此,我希望将此值乘以 10,将得到 17.99999995,然后将其转换为 int 将得到 17

在 Windows 7 上使用 MinGW(v4.9.2 32 位)编译和运行此代码时,我得到了预期的结果 (17)。

在我的 Mac (OS X 10.11) 上使用 CLang (v600.0.57) 编译和运行此代码时,我得到 18,这不是我所期望的,但似乎更多 以数学方式正确

为什么会有这种差异?

有没有办法让操作系统或编译器保持一致的行为?

【问题讨论】:

标签: c++ casting floating-point


【解决方案1】:

就像 Yuushi 在 cmets 中所说,我猜每个编译器的舍入规则可能不同。在此类主题上拥有可移植的解决方案可能意味着您需要编写自己的舍入方法。

因此,在您的情况下,您可能需要检查 7 之后数字的值并增加或不增加该值。让我们这样说:

int main() {
    float NbrToCast = 1.8f;
    float TmpNbr = NbrToCast * 10;
    std::cout << RoundingFloatToInt(TmpNbr) << "\n";
}

int RoundingFloatToInt(const float &val)
{
  float intPart, fractPart;
  fractpart = modf (val, &intpart);
  int result = intPart;
  if (fractpart > 0.5) 
  {
    result++;
  }
  return result;
}

(代码根本没有测试,但你有这个想法)

如果您需要性能,它可能不是很好,但我认为它应该是可移植的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2017-09-04
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多