我的代码正在生成一个输出“NaN”。为什么?
我知道当一些值由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作为输出
(限制本回答IEEE754)。
这是只有可能的,如果条件之一是NaN,或者在阵列a
或b
,或读取未初始化数据的边界之外的访问未定义行为的一些表现。
在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
是负数。
@Bathseba,大声笑现在我得到nan的值,这是早先给出明确的输出 –
你需要把一些代码检查所有的输入。调用堆栈的实际原因会更高。 (类似于0.0/0.0生成一个NaN)。 – Bathsheba
@巴瑟巴,谢谢你!这是一个有点逻辑的错误 –
发生这种情况时,有哪些类型和输入值?添加代码来检测'nan'和break,使用调试器来检查传入的值。有时它只是“垃圾进入,垃圾出来”。 – unwind
调试是你做的第一件事。所以,完成那个 –
@TusharChandra:请不要亲自采取降压措施。对于这个问题,我没有看到任何问题;也许虽然你可以缩短到两个陈述,并整理标题一点。很难为这些事情制定一个有效的例子,假设IEEE754,答案是具体的。 – Bathsheba