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

时间:2018-12-17 08:24:50

标签: c++ c++11 nan

想与std::nanstd::nanf一起使用自定义有效载荷(非装箱)创建nan值。

但是,它确实不能按预期工作:

但是,在Visual Studio 2015中,该功能显然未正确实现。 cppreference.com提出的确切示例产生:

nan("1") = nan (7ff8000000000000)
nan("2") = nan (7ff8000000000000)

这不是我们期望的。 VS实现错误吗?如果不是,那么用于生成7ff80000000000017ff8000000000002的正确参数是什么?

1 个答案:

答案 0 :(得分:4)

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

实际上,Microsoft文档有这样的说法:

  

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