Home > Blockchain >  Did Visual Studio 2022 17.4.3 break std::round?
Did Visual Studio 2022 17.4.3 break std::round?

Time:12-21

(Note: This problem occurs for me only when the compiler switch /arch:AVX is set. More at the bottom)

My gtest unit tests have done this for 7 years

ASSERT_EQ(-3.0, std::round(-2.5f));  // (Note the 'f' suffix)

According to cpp-reference, std::round is supposed to round AWAY from zero, right? Yet with the current release, this test just started failing. Am I missing something? All I did was update my Visual Studio 2022 to 17.4.3 My co-worker with 17.3.3 does not have this problem

EDIT: I don't know if the problem is GTEST and its macros or assumptions my unit test makes about equality. I put the following two lines of code into my test

std::cerr << "std::round(-2.5) = " << std::round(-2.5) << std::endl;
std::cerr << "std::round(-2.5f) = " << std::round(-2.5f) << std::endl;

They produce the following output. The second one is wrong, is it not?

std::round(-2.5) = -3
std::round(-2.5f) = -2

EDIT #2: As I note above, the only occurs when I set the compiler flag /arch:AVX If just create a console app and do not set the flag of if I explicitly set it to /arch:IA32, the problem goes away. But the question then becomes: Is this a bug or am I just not supposed to use that option?

CodePudding user response:

This is a known bug, see the bug report on developercommunity, which is already in the "pending release" state.

For completeness/standalone sake, the minimal example from there is (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';
}

compiled with AVX or AVX2. The correct output e.g. with MSVC 19.33 is

MSVC version: 193331631
Round 0.5f: 1
Round 0.5: 1

while the latest MSVC 19.34 outputs

MSVC version: 193431931
Round 0.5f: 0
Round 0.5: 1
  • Related