开发者

Break on NaNs or infs

开发者 https://www.devze.com 2022-12-13 04:12 出处:网络
It is often hard to find the origin of a NaN, since it can happen at any step of a computation and propagate itself.

It is often hard to find the origin of a NaN, since it can happen at any step of a computation and propagate itself. So is it possible to make a C++ program halt when a computation returns NaN or inf? The best in m开发者_运维技巧y opinion would be to have a crash with a nice error message:

Foo: NaN encoutered at Foo.c:624

Is something like this possible? Do you have a better solution? How do you debug NaN problems?

EDIT: Precisions: I'm working with GCC under Linux.


You can't do it in a completely portable way, but many platforms provide C APIs that allow you to access the floating point status control register(s).

Specifically, you want to unmask the overflow and invalid floating-point exceptions, which will cause the processor to signal an exception when arithmetic in your program produces a NaN or infinity result.

On your linux system this should do the trick:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

You may want to learn to write a trap handler so that you can print a diagnostic message or otherwise continue execution when one of these exceptions is signaled.


Yes! Set (perhaps more or less portably) your IEEE 754-compliant processor to generate an interrupt when a NaN or infinite is encountered.

I googled and found these slides, which are a start. The slide on page 5 summarizes all the information you need.


I'm no C expert, but I expect the answer is no.

  1. This would require every float calculation to have this check. A huge performance impact.
  2. NaN and Inf aren't evil. They may be legitimately used in some library your app uses, and break it.
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号