0

Windows ソフトウェアの gcc/Linux 移植バージョンで、まったく同じ浮動小数点結果を実現したいと考えています。そのため、すべての倍精度演算を 64 ビット精度にしたいと考えています。これは、たとえば -mpc64 または -msse2 または -fstore-floats (すべて副作用あり) を使用して実行できます。ただし、修正できないことの 1 つは、sin/asin などの超越関数です。ドキュメントによると、内部的に long double 精度が期待されている (そして使用されていると思われます)。

これらの関数が 64 ビットの浮動小数点精度を使用して結果を計算するにはどうすればよいですか?

更新: 私は間違っていました。正しい double の結果を誤って丸めるのは printf("%.17f") です。gdb の "print x" は、数値自体が正しいことを示しています。これについては別の質問が必要だと思います...おそらく、printfを内部的に拡張として二重に扱わないようにする方法について。多分 stringstream を使用すると、期待される結果が得られます...はい、そうです。

4

3 に答える 3

0

stringstream << setprecision(17) を使用すると、間違った精度を使用して結果を出力するのは printf("%.17f") であることがわかりました (おそらく内部的に拡張されています)。したがって、答えは質問とはあまり関係ありませんが、少なくとも私にとってはうまくいきます。

しかし、誰かが printf を作成して期待される結果を生成する方法を提供してくれれば幸いです。

于 2013-02-25T09:36:24.897 に答える
0

異なる LibM ライブラリは初等関数に異なるアルゴリズムを使用するため、まったく同じ結果を得るには、Windows と Linux の両方で同じライブラリを使用する必要があります。コンパイルFDLibMして、ソフトウェアと静的にリンクすることをお勧めします。

于 2013-02-25T09:09:38.657 に答える
0

超越関数の問題に対する優れた解決策は、GNU MPFR ライブラリを使用することです。ただし、Microsoft コンパイラは拡張精度浮動小数点をサポートしていないことに注意してください。Microsoft コンパイラでは、double と long double はどちらも 53 ビット精度です。gcc では、long double は 64 ビット精度です。Windows/Linux で一致する結果を得るには、long double の使用を避けるか、Microsoft コンパイラの使用を避ける必要があります。多くの Windows プロジェクトでは、gcc (mingw) の Windows ポートがうまく機能します。これにより、Windows プロジェクトで 64 ビット精度の long double を使用できるようになります。mingw long double サポートの問題は、mingw が printf などの呼び出しに Microsoft ライブラリを使用することです。そのため、long double の出力は正しく機能しません。この問題の回避策は、mpfr_printf を使用することです。

于 2013-05-30T05:32:32.627 に答える