Joe*_*oel 6 c++ locale nan output
我目前正在尝试用 C++ 构建一个简单的控制台计算器,并考虑当用户键入 时该怎么做0/0。在我的计算器中,我将用户输入的每个数字转换为 a ,因此得到应产生 的double除法。0.0/0.0NaN
然而,当我尝试将其输出到控制台时,我注意到更改后的区域设置会出现一些奇怪的行为。对于较大的结果,当每 3 位数字之间有一个分隔符时,读取数字会更容易,因此我最初将 local 更改为en_US,这会将我格式化为一个数字,就像1234.56这1,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根据我的语言环境会得到不同的表示(中间有一些奇怪的字符)。