問題タブ [fenv]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 設定浮動小数点例外環境
std::fenv をポータブルな方法で設定しようとして苦労しています。
このcppreference ページに基づいて、それはfesetexceptflag(const std::fexcept_t*,int)
私がトリックを行うのに役立つはずです. 一方で、GNU にもそのfeenableexcept(int)
機能があることを知りました。私の理解では、それfeenablexcept
はGNU固有のものであり、常にGNUのものにアクセスできる可能性が非常に高いですが、stdのものだけを使用したいと思っていましたfesetexceptflag
。私は小さなテストを書きましたが、feenableexcept
アプローチは機能しますが、fesetexceptflag
機能しないことがわかりました。2 つの例を次に示します。fesetexceptflag
バージョン 1 ( ) とバージョン 2 ( feenableexcept
)を取得するには、main の先頭にある 2 行のコメントを入れ替えます。
バージョン 1 の出力:
バージョン 2 の出力:
したがって、バージョン 1 は fenv で例外フラグを正しく設定しているように見えますが、SIGFPE の発生に失敗しますが、バージョン 2 は例外フラグを設定しませんが、SIGFPE を発生させます。ここで何が起こっているのですか?のドキュメントを誤解していますfesetexceptflag
か? 私の理解では、2番目の引数でアクティブな最初の引数のすべてのビットを取得し、それらをfenvに入れます(これが起こるようです)。しかし、それでは効果がないようです。一方、バージョン 2 はマスク fenv が 0 ですが、SIGFPE を上げることに成功しています。私はとても混乱しています。
Linux マシン (Red Hat) で gcc 8.2.0 を使用しています。
c - feraiseexcept: コンパイラ間の動作の違いと実装定義の動作に関するドキュメントの欠如
サンプルコード (t91.c):
呼び出し:
ISO/IEC 9899:2011 (E):
7.6.2.2 fegetexceptflag 関数
feraiseexcept 関数が ''overflow'' または ''underflow'' 浮動小数点例外を発生させるたびに、さらに ''inexact'' 浮動小数点例外を発生させるかどうかは実装定義です。
ただし、gccのドキュメントと Microsoft Cのドキュメントには、関数の正確な動作が記載されていません (または見つかりません) feraiseexcept
。Clang/LLVMは、ソース コードを介して実装定義の動作を直接文書化することに注意してください。
また、ISO C 準拠の実装には、すべての実装定義およびロケール固有の特性とすべての拡張を定義するドキュメントが付随するものとします(ISO/IEC 9899:2011 (E)、セクション 4 パラグラフ 8)。
質問 (最後に!): なぜ C 実装は、実装定義の特性/動作をすべて文書化しないのですか?
アップデート。はい、GCC のマニュアルにはwrt Library Functionsと記載されています。これらのポイントのほとんどの動作は、C ライブラリの実装に依存しており、GCC 自体によって定義されていません。したがって、( for である) のglibc
実装を検討する必要があります。feraiseexcept
weak_alias
__feraiseexcept
c - C 標準の FE_TONEAREST 丸めモードは、中間タイが偶数に丸められることを保証しますか?
C (特に c11) の偶数への丸めの中間タイに依存するコードを書いています。FE_TONEAREST として丸めモードで rint を使用する場合、FE_NEAREST でタイがどのように処理されるかを示す保証が C 標準に見つかりませんでした。ISO C 標準の 509 ページには、次のように記載されています。
<fenv.h> の fegetround および fesetround 関数は、<fenv.h> の丸め方向マクロ (FE_TONEAREST、FE_UPWARD、FE_DOWNWARD、FE_TOWARDZERO) および値 0、1 によって表される IEC 60559 有向丸めモードから選択する機能を提供します。 FLT_ROUNDS の 、2、および 3 は、IEC 60559 指示丸めモードです。
ただし、丸めモードに関する IEC 60559 標準のドキュメントは見つかりません。私のテスト マシンでは、動作は FE_TONEAREST で同数が偶数に丸められますが、これが c11 標準によって強制され、実装定義ではないことを確認したいと思います。