繁体   English   中英

我如何有效地检测双精度数何时变为NaN? [关闭]

[英]How can I effectively detect when a double becomes NaN? [closed]

我正在开发一个软件,并且在程序的某个点上,双精度数变为NaN,这会破坏整个程序。

我可以获取有关如何调试此类问题以及如何查找将double意外设置为NaN的实际行的帮助吗?

在进行非常复杂的工作的情况下,有时有时很难缩小NaN 《基于物理的渲染》的作者记录了一个棘手的案例,例如,由于某些表达式对NaN求值结果,其光线跟踪器的速度降低了,从而导致随后的计算量过大。 这些事情很难发现,特别是在这种情况下,只有一百万次发生。

一个方便的技巧是依靠IEEE标准,如果与变量相比,如果变量的值为NaN则变量将返回false。 这可能不适用于所有编译器,因此您可能需要确保在使用断言之前就可以了,但是...

boolean is_nan(double val)
{
    return val != val;
}

但是,在Java中,我们不需要此技巧。 我们已经在java.lang.Double有了isNan

使用此方便工具,您可以通过进行健全性检查来通过消除过程来缩小NaN的发生范围,例如:

double val = ...;
// after various arithmetical operations
assert !Double.isNan(val);

然后,您可以在遇到断言失败时添加更多此类的细化检查,并记下断言失败的哪一行代码,从而向下(向上?)缩小工作范围,并确切地缩小生成NaN的代码行。 在非常复杂的场景(例如引用的raytracer场景)中,这种情况可能仅发生一百万次,这比尝试通过调试器跟踪所有内容要快得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM