Joe*_*Joe 5 c++ visual-studio visual-studio-2022
(注:这个问题只有在设置编译器开关时才会出现/arch:AVX。更多内容在底部)
我的 gtest 单元测试已经这样做了 7 年
ASSERT_EQ(-3.0, std::round(-2.5f)); // (Note the 'f' suffix)
Run Code Online (Sandbox Code Playgroud)
根据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;
Run Code Online (Sandbox Code Playgroud)
它们产生以下输出。第二个是错的吧?
std::round(-2.5) = -3
std::round(-2.5f) = -2
Run Code Online (Sandbox Code Playgroud)
编辑#2:正如我上面提到的,只有当我设置编译器标志时才会发生/arch:AVX 如果只是创建一个控制台应用程序并且不设置标志,如果我将其显式设置为/arch:IA32,问题就会消失。但问题就变成了:这是一个错误还是我不应该使用该选项?
这是一个已知的错误,请参阅开发者社区上的错误报告,该错误报告已处于“待发布”状态。
为了完整性/独立性,最小的例子是(godbolt):
int main()
{
std::cout << "MSVC version: " << _MSC_FULL_VER << '\n';
std::cout << "Round 0.5f: " << std::round(0.5f) << '\n';
std::cout << "Round 0.5: " << std::round(0.5) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
使用 AVX 或 AVX2 编译。正确的输出例如 MSVC 19.33 是
MSVC version: 193331631
Round 0.5f: 1
Round 0.5: 1
Run Code Online (Sandbox Code Playgroud)
而最新的 MSVC 19.34 输出
MSVC version: 193431931
Round 0.5f: 0
Round 0.5: 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |