为什么在C++中0.0/0.0会产生负数nan?

3
我从SoloLearn发现以下内容:

我发现0.0/0.0会生成负的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;
}

但这并不符合我的逻辑..


1
clang 和 gcc 的区别在于活动的链接: https://godbolt.org/z/vc37qG - Richard Critten
2
我在另一个论坛中找到了一个2020年的完全复制品,链接如下:https://www.sololearn.com/Discuss/2152517/why-0-0-0-0-makes-negative-nan-in-c/. 如果你复制了部分文本,我想你已经阅读过它了。那么,这个问题没有回答你想知道的是什么?如果你只是想将其添加到SO中,你可以使用自己回答问题的选项。 - Gary Strivin'
2
在这里提出一个未被问到的问题是可以的。但抄袭是不允许的。如果你复制并粘贴了一个问题,你应该链接它的来源。这不仅是因为抄袭,还因为那个网站上已经有了答案。 - t.niese
1
正NaN和负NaN的区别“...因此,您平台的转换函数可能会打印NaN值的“符号”,但它没有任何意义,而且您不应该考虑它用于测试目的....” - Richard Critten
“accomply”是什么意思(它不是一个单词)?“Comply”?“Accomplish”?我尝试替换的任何内容似乎都不合适。你是否只是意味着你的结果与链接和引用的问题不匹配?如果是这样,你应该将你的结果添加到你的问题中。 - JaMiT
1个回答

5
就C++语言而言,程序的行为是未定义的。因此,从C++的角度来看,关于程序行为的任何事情都没有“原因”。
根据IEEE-754浮点数标准,假设您的硬件和语言实现符合它(它们可能会),这种除法的结果是NaN。IEEE-754不为任何操作指定NaN的符号。因此,从IEEE-754的角度来看,答案是:对于您的系统,语言/硬件实现已经选择了某些原因(或者只是没有特别的原因)。
总之:您永远不应该依赖NaN的符号是特定的任何内容。通常应避免除以零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接