我正在使用 MSVC 2019 v16.11.12。
当我尝试使用 /fp:fast 而不是 /fp:precise 编译我的代码时,我的测试开始失败。
最简单的情况是:
BOOST_AUTO_TEST_CASE(test_division) {
float v = 3000.f;
BOOST_TEST((v / 1000.f) == 3.f);
}
执行结果出错:
错误: 在"test_division"中,检查 (v / 1000.f) == 3.f 时失败了 [3.00000024 != 3]
我知道/fp:fast在某些情况下可能会导致浮点数精度更差;但是,在这种情况下,看起来过于夸张...
为什么它不能准确地将3000除以1000?
我知道0.1 + 0.2不等于0.3,但是这里所有数字都是可表示的,而且使用fp:precise后该除法返回的确切值为3。
有可能我开启了其他标志,进一步降低了浮点数精度吗?
fp:fast
构建时,这段代码最后一个结果的位模式与0x40400000
不同,为0x40400001
。 - Adrian Mole