(注意:只有当编译器开关/arch:AVX
被设置时,我才会遇到这个问题。更多信息请见底部)
我的gtest单元测试已经做了7年了。
ASSERT_EQ(-3.0, std::round(-2.5f)); // (Note the 'f' suffix)
根据cpp-reference,,
std::round
应该是向远离零的方向四舍五入,对吗?然而,在当前版本中,这个测试刚刚开始失败了。我错过了什么吗?我所做的就是将我的Visual Studio 2022更新到17.4.3。我的同事使用的是17.3.3,他没有这个问题。编辑:我不知道问题是GTEST及其宏还是我的单元测试对相等性的假设。我在我的测试中加入了以下两行代码。
std::cerr << "std::round(-2.5) = " << std::round(-2.5) << std::endl;
std::cerr << "std::round(-2.5f) = " << std::round(-2.5f) << std::endl;
它们产生以下输出。第二个是错误的,不是吗?
std::round(-2.5) = -3
std::round(-2.5f) = -2
编辑 #2:如我上面所述,只有当我设置编译器标志/arch:AVX
时才会出现这个问题。如果只是创建一个控制台应用程序而不设置标志,或者明确将其设置为/arch:IA32
,问题就会消失。但问题随之而来:这是一个错误还是我不应该使用该选项?
assert()
)来证明。 - PaulMcKenziedouble
返回double
的std::round
重载。 - user17732522std::round(float)
被转发到其中,但库的实现并没有这样做:https://godbolt.org/z/898eE1es9(我认为这是一个bug,但也不确定)。 - user17732522