私は光輸送の数値シミュレーションのために、Linux上で、C++ 11でパストレーサを書いていますし、私は最終的には、実行中に発生する可能性のある数値誤差をキャッチし、デバッグするためにいくつかの特定のC++ 11コードセグメントに対してのみ、SIGFPE生成を{activate | de-activate}することは可能ですか?
#include <fenv.h>
...
feenableexcept(FE_INVALID |
FE_DIVBYZERO |
FE_OVERFLOW |
FE_UNDERFLOW);
を使用しています。
コードのある時点で、軸合わせ境界ボックス(AABB)に対する光線(線分)の交点を計算する必要があります。この計算では、私は非常に最適化された頑強なray-box intersection algorithmを使用しています。これは、IEEE 754標準に記述されているいくつかの特別な値(例えば、NaNとinf)の生成に依存しています。明らかに、私はこのレイボックス交差ルーチンによって特別に生成された浮動小数点例外をキャッチすることには興味がありません。
したがって、私の質問は以下のとおりです。
- それは(すなわち、レイ・ボックス交差点のコードセクションのための)コードの一部だけのセクションのための浮動小数点例外信号(SIGFPE)の生成を無効にすることは可能ですか?
- シミュレーションを計算するときには、 のパフォーマンスが非常に懸念されます。特定のコードセクションの例外 シグナルを抑制することができる場合は、 コンパイル時に実行できます(高価な関数呼び出しを避けることができるように、 世代中のコードの計装/除算)?
ありがとうございました!
他のコードで浮動小数点トラッピングを有効にしますか?浮動小数点トラップは、デフォルトでは無効になっています。その場合、パストレースコードでは既にオフになっています。他のコードで浮動小数点トラッピングを特に必要としない限り、他のコードに対してはオンにする必要はありません。 –
@EricPostpischil現在、私は浮動小数点のトラップをコード全体で有効にしています(質問にあるコードの抜粋を使用しています)。私がしたいのは、特定のコードセクションを除いて、コード全体に対して浮動小数点のトラップをオンにすることです。 –