【问题标题】:How get -nan on C++ 14?如何在 C++ 14 上获得 -nan?
【发布时间】:2017-05-23 23:14:05
【问题描述】:

我需要让-nan 只使用double 类型和算术。

所以,代码应该是这样的:

double a = ...

cout << a << endl;

-nan

... 是一些表达式。

【问题讨论】:

  • “需要”。这是作业要求吗?

标签: c++ c++14 nan


【解决方案1】:

如果您的平台使用 IEEE754 浮点,则 0.0 / 0.0 将评估为 NaN。

您也可以使用std::numeric_limits&lt;double&gt;::quiet_NaN(),在您的平台上检查std::numeric_limits&lt;double&gt;::has_quiet_NaNtrue

确实没有签名NaN 这样的东西,尽管NaN 的表示可能包含一个可以被std::cout 拾取的符号位。也许在您的平台上-0.0 / 0.0 会生成一个“否定”NaN。在aNaN 的情况下,cout &lt;&lt; a 的结果完全取决于编译器。

【讨论】:

  • 这是唯一的constexpr 方式。
  • 确实如此。出于这个原因,我不喜欢std::nan("1"); 路线。
【解决方案2】:

你可以直接使用std::nan,例如

#include <iostream>
#include <cmath>

int main()
{
    double a = -std::nan("1");

    std::cout << a << std::endl;
}

LIVE DEMO

【讨论】:

  • 我会将这个问题标记为答案,但我说你只需要使用算术,所以答案是 (INFINITY_NUMBER / INFINITY_NUMBER) = -NaN,但我认为你做出这个答案只是我不好的原因英语
  • 抱歉,是的,我可能没有按照您的意图解释您的问题。这种约束的原因是什么?表现 ?你不能把值初始化为常量吗?
【解决方案3】:

要得到一个负的 nan,只需用 0x80000000 或一个 NaN 表示。您必须尝试将地址转换为 unsigned char * 或 long long * 或课程。

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2019-12-08
    • 2017-09-24
    • 1970-01-01
    • 2021-02-23
    • 2018-10-30
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多