【问题标题】:Any reason why 0.0/0.0 makes negative nan in C++?为什么 0.0/0.0 在 C++ 中产生负 nan 的任何原因?
【发布时间】:2021-05-23 12:27:51
【问题描述】:

我从SoloLearn找到了以下内容:

我发现 0.0/0.0 产生负 nan(-nan)。 对我来说,这样的数学结果是未定义的,或者“不是数字”是有道理的。 [...]

另外,为什么是-nan+2^nan=nan?

例如:

#include <iostream>
using namespace std;

int main() {
    cout<<0.0/0.0<<endl;
    cout<<"important "+to_string(1.0/0.0)+"o:"<<endl;
    cout<<"ba"+to_string(0.0/0.0*-1)+"a"<<endl;
    cout<<(0.0/0.0)+2^(0.0/0.0*-1);//-nan+2^nan=nan
    return 0;
}

但这还不够我的逻辑..

【问题讨论】:

  • clang 和 gcc 在 live 中不同:godbolt.org/z/vc37qG
  • 我在另一个论坛上找到了 2020 年到这个问题的精确副本:sololearn.com/Discuss/2152517/…。如果您复制了部分文本,我想您已经阅读了它。那么,这个问题没有回答你想知道的什么?如果您只想将其添加到 SO,您可以使用该选项来回答您自己的问题。
  • 问一个这里没有问的问题很好。但抄袭不是。如果您复制并粘贴问题,则应链接其来源。不仅因为抄袭,还因为该网站上已经有答案。
  • +ve vs -ve NaNs stackoverflow.com/questions/21349847/positive-vs-negative-nans "...所以你平台的转换函数可能会打印 NaN 值的“符号”,但它没有任何意义,你不应该出于测试目的考虑它....”
  • “accomply”是什么意思(不是一个词)? “遵守”? “完成”?我尝试过的任何替代方法似乎都不合适。您是否只是表示您的结果与链接和引用的问题中的结果不匹配? (如果是这样,您应该将结果添加到您的问题中。)

标签: c++ nan undefined-behavior


【解决方案1】:

就 C++ 语言而言,程序的行为是未定义的。因此,从 C++ 的角度来看,程序的行为没有任何“理由”。

根据 IEEE-754 浮点标准,假设您的硬件和语言实现符合它(他们可能这样做),这种除法的结果是 NaN。 IEEE-754 没有为任何操作指定 NaN 的符号。因此,从 IEEE-754 的角度来看,答案是:无论语言/硬件实现选择何种原因(或没有特定原因),它都恰好出现在您的系统上。

结论:你不应该依赖 NaN 的符号是什么特别的东西。而且您通常应该避免除以零。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2011-02-03
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多