Visual Studio 下的 std::nan/std::nanf 有什么问题?

jpo*_*o38 1 c++ nan c++11

想使用std::nanstd::nanf来创建带有一些自定义有效负载(非装箱)的 nan 值。

但是,它确实没有按预期工作:

但是,对于 Visual Studio 2015,该功能显然没有正确实现。cppreference.com 提出的确切样本产生:

nan("1") = nan (7ff8000000000000)
nan("2") = nan (7ff8000000000000)
Run Code Online (Sandbox Code Playgroud)

这不是我们所期望的。VS 实现有错吗?如果不是,那么用于产生7ff8000000000001和的正确参数是7ff8000000000002什么?

Max*_*hof 5

std::nan 根据定义,具有实现定义的行为,因此只要返回某种安静的 NaN,VS 肯定不会错。

事实上,微软文档有这样的说法:

这些nan函数返回一个浮点值,该值对应于一个安静的(无信号)NaN。输入值被忽略。有关如何为输出表示 NaN 的信息,请参阅 printf、_printf_l、wprintf、_wprintf_l。

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/nan-nanf-nanl?view=vs-2017

基于一个小测试,这似乎是真的(不出所料):

std::nan("1") = 7ff8000000000000
std::nan("2") = 7ff8000000000000
std::nan("NAN(1)") = 7ff8000000000000
std::nan("NAN(2)") = 7ff8000000000000
std::nan("NAN1") = 7ff8000000000000
std::nan("NAN2") = 7ff8000000000000
std::nan("NAN 1") = 7ff8000000000000
std::nan("NAN 2") = 7ff8000000000000
Run Code Online (Sandbox Code Playgroud)