一部のIntelFORTRANコードで奇妙なクラッシュが発生しており、最終的に次の行を追跡しました。
L_F = EXP(-L_B2*L_BETASQ*L_DS)
ここで、-L_B2 * L_BETASQ*L_DS項は約-230と評価されました。たまたま、EXP(-230)は約1e-100と評価されます。他のすべての既知のケースでは、L_DSははるかに小さいため、EXPからの最小の(既知の)リターンは約1e-50であり、エラーは発生しません。
FORTRANがEXP(-230)句を評価するとすぐに、次のようになります。
forrtl: severe (157): Program Exception - access violation
Image PC Routine Line Source
しかし、他の情報はありません。
例外157は一般に相互運用性に関係しており、特定の.cファイルが見つからないため、FORTRANでEXPにデバッグすることはできません。これはおそらくEXPがCで実装されていることを意味します(これは驚くべきことです)。
私の仮説では、FORTRANはCでEXPを実装していますが、インターフェースは1e-100より小さいフロートをREAL(4)に変換できません。以前、floatとREAL(4)はバイト単位で同一であると信じていたので、この仮説を裏付けることはできません。また、それについて何も見つけることができません。
このバグを閉じる前に、誰かが私の仮説を確認または否定できますか?または別の仮説を提供できますか?
よろしくお願いします、
マイク
編集: ハイパフォーマンスマークが当面の質問に回答したので、この質問を回答済みとしてマークします。
私の仮説は残念ながら正しくありません-私はこれを行うことで問題をトラップしようとしました:
L_ARG = L_B2*L_BETASQ*L_DS
IF (L_ARG .GT. 230.0) THEN
L_F = 0.0
ELSE
L_F = EXP(-L_ARG)
ENDIF
残念ながら、例外は現在(明らかに)L_ARG.GTで発生しています。230.0句。これは、リリースモードでのデバッグが思ったより悪いか、ある種の「保存された」浮動小数点エラーであることを意味します(文字列ストリームにfloatを入力するときの「浮動小数点の無効な操作」を参照)。