c++ - C++ - 奇数互易不等式
问题描述
我遇到了浮点倒数的一个令人惊讶的奇怪之处,它似乎只是有时才会发生。
为什么在意想不到的时候,给定两个花车,
浮动 a = ..., b = ...;
一次测试它们的等价性表明它们是平等的,
cout << (a == b ? "T" : "F") << endl; // 打印 T
然而,当调整同一行来测试倒数的相等性,并且没有不同地运行程序时,它们突然不相等:
cout << (1/a == 1/b ? "T" : "F") << endl; // 打印 F
在这里,a
and b
are not NaN
,它们既不是-INF
nor +INF
,它们也不是0
(它们通常在 3000 范围内,带有十进制值)。我还注意到,当cout
以某种方式编译和运行这两个表达式时,它们都会 print T
。
为什么会这样?我非常熟悉浮点数和相关的精度问题,但我希望对相同值的操作会产生相同的结果。或者有时除法可以是某些CPU上的猜测/近似指令?
任何澄清将不胜感激。
编辑:
附带说明,因为我开始认为这是我的编译器正在做的事情,所以我使用的是 MinGW32 GCC 版本 4.8.1。对于针对 C++14,我使用了 flag -std=c++1y
,因为这个版本似乎不支持-std=c++14
flag。
编辑
这可能是编译器错误吗?我已经确定这是 GCC 4.8.1 编译器中的一个问题,仅在使用优化 (-O2
或-O3
) 进行编译时才会出现。
解决方案
推荐阅读
- mysql - 将 mysql 中的 TIME 数据类型限制为仅保留到 24:00:00 小时
- react-native - 我在尝试安装 expo-cli 时收到此错误“npm ERR!在 '...nPGP.js v3.0.4\r\nCom' 附近解析时 JSON 输入意外结束”
- stored-procedures - 计数在存储过程中给出错误的结果
- javascript - 节点js中的for循环异步
- firebase - 使用节点中的云函数在firebase项目中设置/更改环境变量
- android - 回收器视图中的回收器视图垂直滚动不起作用
- html - 首先如何让 Bootstrap Collapse 隐藏内容?
- python - ImportError:无法从“tensorflow”导入名称“set_random_seed”(C:\Users\polon\Anaconda3\lib\site-packages\tensorflow\__init__.py)
- javascript - 单击视频后,我想在模型对话框中显示视频
- unit-testing - TypeError: moment 不是函数 - Angularjs Jasmine 测试用例