c++ - 在 MinGw 和 Clang 之间将 float 转换为 int 不一致

标签 c++ casting floating-point

使用 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 32bits) 编译和运行这段代码时,我得到了预期的结果 (17)。

在我的 Mac (OS X 10.11) 上使用 CLang (v600.0.57) 编译和运行此代码时,我得到 18 结果,这不是什么我在期待,但从数学的角度来看,这似乎更正确!

为什么我会得到这种差异?

有没有一种方法可以使无论操作系统还是编译器都具有一致的行为?

最佳答案

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

因此,在您的情况下,您可能需要检查 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;
}

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

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

关于c++ - 在 MinGw 和 Clang 之间将 float 转换为 int 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884572/

相关文章:

scala - 避免使用类型成员和子类型进行类型转换

java - 如果数字平分?

c++ - 如何将整数 vector 插入 std::map 的键、值

c++ - 为什么 QueryInterface() 会在接口(interface)确实实现并且在 Windows 中具有内置编码器时失败?

java - 如何摆脱 Android Studio 上的可疑调用警告?

postgresql - 从字符串中解析间隔的最佳方法是什么?

c++ - 单例死引用问题

C++预处理器

floating-point - 如何在 SMT-LIB 标准中表示浮点常量(如 1e307)?

floating-point - double 十进制表示形式中的连续零个数