0

非常に集中的な計算を行う従来の FORTRAN プロジェクトがあります。この数学コードに C/C++ コードからアクセスできるようにしたいので、FORTRAN dll を作成し、それを C/C++ にインポートして、FORTRAN dll から浮動小数点アンダーフローを受け取り始めました。

同時に、FORTRAN アプリケーションから呼び出した場合、FORTRAN dll コードは正常に実行されます。

最後に、私が使用しているコンパイラ (VS2013 に統合された FTN 95 です) にはオプション ( /UNDERFLOW ) があることがわかりました。このフラグが指定されていない場合、デフォルトですべてのアンダーフローがゼロに変換されます。それはFORTRANアプリで起こります。C コードを使用してこの dll からメソッドを実行すると、アンダーフローが発生します。

質問は、VC++ コンパイラにアンダーフローをゼロに変換させる方法はありますか?

PS: はい、浮動小数点例外をスローするコードにずっと依存するのはばかげていることは理解しています。ただし、このコードは古く、現時点で最新の手法を使用して完全に書き直すことは不可能です。

4

1 に答える 1

0

つまり、問題は FTN95 コンパイラにありました。上記のフラグ ( /UNDERFLOW ) は、アプリケーションをビルドする場合にのみ役立つようです。ターゲット出力が DLL の場合、このフラグの効果は無視されます。これの代わりに、 MASK_UNDERFLOW@()サブルーチンへの呼び出しを通じてアクセスされるコンパイラ ディレクティブを見つけました。アンダーフローをスローしていた FORTRAN 関数にこのサブルーチンへの明示的な呼び出しを挿入し、DLL を再コンパイルした後、C プログラムを正常に起動し、FORTRAN dll の関数を使用して必要な計算を実行することができました。また、fp:/except- VC++ コンパイラ フラグを使用して、他のアンダーフローが C プログラムの実行に影響を与えないようにしました。

于 2015-04-13T11:55:07.273 に答える