C++ VisualStudio下的std::nan/std::nanf有什么问题?

C++ VisualStudio下的std::nan/std::nanf有什么问题?,c++,c++11,nan,C++,C++11,Nan,想要使用一些定制的负载非装箱,并创建nan值 但是,它确实没有如预期那样起作用: 然而,在Visual Studio 2015中,该功能显然没有正确实现。cppreference.com提出的确切样本产生: nan("1") = nan (7ff8000000000000) nan("2") = nan (7ff8000000000000) 这不是我们所期望的。VS实现是否错误?如果不是,那么使用什么正确的参数来生成7FF80000000001和7FF80000000002呢?std::nan

想要使用一些定制的负载非装箱,并创建nan值

但是,它确实没有如预期那样起作用:


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

nan("1") = nan (7ff8000000000000)
nan("2") = nan (7ff8000000000000)
这不是我们所期望的。VS实现是否错误?如果不是,那么使用什么正确的参数来生成7FF80000000001和7FF80000000002呢?

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

事实上,微软文档中有这样一句话:

nan函数返回一个与安静的非信令nan相对应的浮点值。输入值被忽略。有关如何为输出表示NaN的信息,请参见printf、_printf_l、wprintf、_wprintf_l

根据一个小测试,这似乎是正确的,这并不令人惊讶:

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
根据定义,nan具有实现定义的行为,所以只要VS返回某种安静的nan,它肯定没有错

事实上,微软文档中有这样一句话:

nan函数返回一个与安静的非信令nan相对应的浮点值。输入值被忽略。有关如何为输出表示NaN的信息,请参见printf、_printf_l、wprintf、_wprintf_l

根据一个小测试,这似乎是正确的,这并不令人惊讶:

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

引用中的第一行:转换实现定义的字符串。这使得VS实现是错误的吗?空洞地回答为否。@StoryTeller:明白你的意思了。但如果它总是返回相同的值,那又有什么关系呢!?嗯,如果您想要一个NaN值,但没有传递特定NaN的实现定义序列,那么这看起来是非常明智的行为。这也是同一参考页面第一段的最后一行。cppreference.com提出的确切示例产生了-如果实现不支持安静的NaN,则该示例后面会出现短语“可能输出”或“零”。是的,从来没有。它只有在您没有1-800支持电话号码时才会安静:参考:转换实现定义的字符串中的第一行。这使得VS实现是错误的吗?空洞地回答为否。@StoryTeller:明白你的意思了。但如果它总是返回相同的值,那又有什么关系呢!?嗯,如果您想要一个NaN值,但没有传递特定NaN的实现定义序列,那么这看起来是非常明智的行为。这也是同一参考页面第一段的最后一行。cppreference.com提出的确切示例产生了-如果实现不支持安静的NaN,则该示例后面会出现短语“可能输出”或“零”。是的,从来没有。只有当您没有1-800支持电话号码时,它才会变得安静:这是有道理的。他们做了错事或懒惰的方式,但至少有记录在案;-塔克斯@jpo38具有讽刺意味的是,该页面上的链接有关如何表示输出的NaN的信息,请参阅。导致一个页面,不谈论南斯…这是有意义的。他们做了错事或懒惰的方式,但至少有记录在案;-塔克斯@jpo38具有讽刺意味的是,该页面上的链接有关如何表示输出的NaN的信息,请参阅。导致一个页面,不谈论南斯。。。