2017-06-22 130 views
0

我知道当一些值由0 但在我的情况下分割,这个错误通常发生:我的代码正在生成一个输出“NaN”。为什么?

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作为输出

+4

发生这种情况时,有哪些类型和输入值?添加代码来检测'nan'和break,使用调试器来检查传入的值。有时它只是“垃圾进入,垃​​圾出来”。 – unwind

+0

调试是你做的第一件事。所以,完成那个 –

+0

@TusharChandra:请不要亲自采取降压措施。对于这个问题,我没有看到任何问题;也许虽然你可以缩短到两个陈述,并整理标题一点。很难为这些事情制定一个有效的例子,假设IEEE754,答案是具体的。 – Bathsheba

回答

2

(限制本回答IEEE754)。

这是只有可能的,如果条件之一是NaN,或者在阵列ab,或读取未初始化数据的边界之外的访问未定义行为的一些表现。

在IEEE754下,不能通过大数值的乘法获得NaN。

从C++ 11,你可以用std::isnan检测NaN,在此之前或C,使用成语

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

因此,设定不确定的行为不谈,问题的原因是更高的调用堆栈。诸如0.0/0.0的表达式将生成一个NaN。


关于你的声明

一些值由0

分为 “一些价值”,当由0.0分的只有价值给您楠0:0.0/0.0是NaN,并且a/0.0是+ Inf,如果a是正数,并且-Inf如果a是负数。

+0

@Bathseba,大声笑现在我得到nan的值,这是早先给出明确的输出 –

+0

你需要把一些代码检查所有的输入。调用堆栈的实际原因会更高。 (类似于0.0/0.0生成一个NaN)。 – Bathsheba

+0

@巴瑟巴,谢谢你!这是一个有点逻辑的错误 –

相关问题