【问题标题】:What's wrong with std::nan/std::nanf under Visual Studio?Visual Studio 下的 std::nan/std::nanf 有什么问题?
【发布时间】:2019-05-17 14:06:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 参考中的第一行:“转换实现定义的字符串”。这使得 “VS 实现错误吗?” 空洞地回答为否。
  • @StoryTeller:明白你的意思。但是如果它总是返回相同的值怎么办?
  • 好吧,如果你想要一个 NaN 值,但你没有为 specific NaN 传递实现定义的序列,这似乎是非常理智的行为。它也是同一参考页第一段的最后一行。
  • “cppreference.com 提出的确切样本产生” - 该样本后跟短语“可能的输出”
  • "如果实现不支持安静的 NaN,则为零"。是的,它从来没有。只有当您没有 1-800 支持电话号码时,它才会变得安静 :)

标签: c++ c++11 nan


【解决方案1】:

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

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

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

【讨论】:

  • 这是有道理的。他们做错事(或懒惰的方式),但至少记录了它;-) 谢谢!
  • @jpo38 具有讽刺意味的是,该页面上的链接(“有关如何为输出表示 NaN 的信息,请参阅printf, _printf_l, wprintf, _wprintf_l。”)指向一个不讨论 NaN 的页面......
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2021-08-17
  • 1970-01-01
  • 2017-06-22
  • 2018-11-29
  • 2019-09-21
相关资源
最近更新 更多