Visual Studio 2022 17.4.3 是否破坏了 std::round?

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,问题就会消失。但问题就变成了:这是一个错误还是我不应该使用该选项?

Gug*_*ugi 1

这是一个已知的错误,请参阅开发者社区上的错误报告,该错误报告已处于“待发布”状态。

为了完整性/独立性,最小的例子是(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)