首页 > 解决方案 > C++ - 奇数互易不等式

问题描述

我遇到了浮点倒数的一个令人惊讶的奇怪之处,它似乎只是有时才会发生。

为什么在意想不到的时候,给定两个花车,

浮动 a = ..., b = ...;

一次测试它们的等价性表明它们是平等的,

cout << (a == b ? "T" : "F") << endl; // 打印 T

然而,当调整同一行来测试倒数的相等性,并且没有不同地运行程序时,它们突然相等:

cout << (1/a == 1/b ? "T" : "F") << endl; // 打印 F

在这里,aand bare not NaN,它们既不是-INFnor +INF,它们也不是0(它们通常在 3000 范围内,带有十进制值)。我还注意到,当cout以某种方式编译和运行这两个表达式时,它们都会 print T

为什么会这样?我非常熟悉浮点数和相关的精度问题,但我希望对相同值的操作会产生相同的结果。或者有时除法可以是某些CPU上的猜测/近似指令?

任何澄清将不胜感激。

编辑:
附带说明,因为我开始认为这是我的编译器正在做的事情,所以我使用的是 MinGW32 GCC 版本 4.8.1。对于针对 C++14,我使用了 flag -std=c++1y,因为这个版本似乎不支持-std=c++14flag。

编辑
这可能是编译器错误吗?我已经确定这是 GCC 4.8.1 编译器中的一个问题,仅在使用优化 (-O2-O3) 进行编译时才会出现。

标签: c++c++14precisiondivisionmingw32

解决方案


推荐阅读