関数がC/C++で一貫した浮動小数点値を返すようにする方法は?
つまりa
、 とb
が浮動小数点型の場合、多項式関数 (浮動小数点の引数を取り、浮動小数点の結果を返す) を作成した場合、それを呼び出すことができますpolyfun()
。コンパイラは次のことを保証できますか?
if a==b
, thenpolyfun(a)==polyfun(b)
は、実行時に数学演算/切り上げの順序が一貫していることを意味しますか?
関数がC/C++で一貫した浮動小数点値を返すようにする方法は?
つまりa
、 とb
が浮動小数点型の場合、多項式関数 (浮動小数点の引数を取り、浮動小数点の結果を返す) を作成した場合、それを呼び出すことができますpolyfun()
。コンパイラは次のことを保証できますか?
if a==b
, thenpolyfun(a)==polyfun(b)
は、実行時に数学演算/切り上げの順序が一貫していることを意味しますか?
再現可能な結果は、言語標準によって保証されていません。一般に、C 実装では、公称型よりも高い精度で浮動小数点式を評価することが許可されています。関数呼び出しをある場所でインライン化し、別の場所ではインライン化しない、または関数呼び出しを 2 つの場所でインライン化するが、1 つの場所で結果を名目上の型に絞り込んで後で取得する前にスタックに保存するなど、予測できない方法でこれを行う可能性があります。それを別の値と比較します。
この質問にはいくつかの追加情報があり、他の重複もある可能性があります。
これに対処する方法は、言語および実装 (特にコンパイラ) によって異なるため、使用している C または C++ 実装を指定すると、ターゲット システムの詳細を含め、関連する質問を検索すると、追加情報が得られる場合があります。 .
polyfun(a)==polyfun(b) の代わりに、ABS(polyfun(a) - polyfun(b)) < 1e-6、または 1e-12、または「近さ」に適していると思われるものを試してください... (ええ、累積的な浮動小数点エラーは依然としてあなたを殺します.)