使用 std::cout 和更改的语言环境打印“NaN”时出现奇怪的输出

Joe*_*oel 6 c++ locale nan output

我目前正在尝试用 C++ 构建一个简单的控制台计算器,并考虑当用户键入 时该怎么做0/0。在我的计算器中,我将用户输入的每个数字转换为 a ,因此得到应产生 的double除法。0.0/0.0NaN

然而,当我尝试将其输出到控制台时,我注意到更改后的区域设置会出现一些奇怪的行为。对于较大的结果,当每 3 位数字之间有一个分隔符时,读取数字会更容易,因此我最初将 local 更改为en_US,这会将我格式化为一个数字,就像1234.561,234.56确实是想要的行为。但作为NaN输出,它并没有像我想象的那样工作。

在下面的示例代码中,我用来std::sqrt(-1)获取NaN结果,因为我的编译器(MSVC)不允许我划分0/0.0. 首先,我没有指定区域设置("C"如果我没有弄错的话,它应该给我区域设置,至少我得到了相同的输出,没有任何 vs "C")。之后,我更改为语言环境"""en_US"这两者都给了我不同的输出,中间有一些看似随机的分隔符。

代码:

#include <iostream>
#include <locale>
#include <cmath>

int main()
{
    //std::cout.imbue(std::locale("C"));
    std::cout << std::sqrt(-1) << std::endl;

    std::cout.imbue(std::locale(""));
    std::cout << std::sqrt(-1) << std::endl;

    std::cout.imbue(std::locale("en_US"));
    std::cout << std::sqrt(-1) << std::endl;

    std::cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

#include <iostream>
#include <locale>
#include <cmath>

int main()
{
    //std::cout.imbue(std::locale("C"));
    std::cout << std::sqrt(-1) << std::endl;

    std::cout.imbue(std::locale(""));
    std::cout << std::sqrt(-1) << std::endl;

    std::cout.imbue(std::locale("en_US"));
    std::cout << std::sqrt(-1) << std::endl;

    std::cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了让我的计算器不打印一些奇怪的输出,我可以NaN在输出它之前检查该值是否是,但我仍然想知道为什么NaN根据我的语言环境会得到不同的表示(中间有一些奇怪的字符)。

Joe*_*oel 3

我创建了一个错误报告,这确实是标准库中的一个错误,将在更高版本的 Visual Studio 中修复。

该错误已修复,预计在 VS 2022 17.8 Preview 2 中修复