[英]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.