我的代码正在生成输出" NaN"。为什么?

时间:2017-06-22 10:46:13

标签: c++

我知道当某个值除以0时,通常会发生此错误。 但就我而言:

c[0]=((a[1]*b[2])-(a[2]*b[1]));
c[1]=((a[2]*b[0])-(a[0]*b[2]));
c[2]=((a[0]*b[1])-(a[1]*b[0]));
cout<<c[0]<<c[1]<<c[2];

这段代码有时会生成 NaN 作为输出

1 个答案:

答案 0 :(得分:2)

(限制对IEEE754的回答)。

如果其中一个术语是NaN,或者在您访问数组ab范围之外的某些未定义行为表现形式时,可能阅读未初始化的数据。

在IEEE754下,您无法通过乘以大值来获得NaN。

从C ++ 11开始,您可以使用std::isnan来检测NaN,在此之前或在C中,使用成语

if (f != f){
    // `f` is NaN
}

因此,将未定义的行为放在一边,问题的原因在于调用堆栈更高。表达式如0.0 / 0.0将生成NaN。

关于你的陈述

  

某个值除以0

值&#34;某些值&#34;当除以0.0时,NaN为0:0.0 / 0.0为NaN,如果a / 0.0为正,则a为+ Inf;如果a为负,则为{Inf。< / p>