0

小数値を正確に解析するにはどうすればよいですか? つまり、「43.879」のような値の文字列があり、正確な GMP 値を取得したいと考えています。ドキュメントからは、どのように、またはこれが実際に可能かどうかはわかりません。整数/有理数/浮動小数点値の型には適合しないようですが、おそらく有理数をいじることは可能です。

私の意図は、加算や減算などの演算では正確な精度の小数を保持することですが、除算や指数などの演算では高精度の浮動小数点に切り替えることです。

4

1 に答える 1

0

ほとんどのライブラリは、GMP を含め、任意に大きな精度を提供します。ただし、精度が高くても、10 進数で 1/3 を表すことができないのと同じように、2 進数形式で正確に表すことができない数値があります。多くのアプリケーションでは、精度を 10 などの高い数値に設定し、計算を実行してから、結果を目的の精度 (3 作業など) に丸めます。それはあなたのために働かないでしょうか?これを参照してください - Java の BigDecimal に相当する C++ はありますか?

http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-libraryを使用することもできます

********* 編集

多くの数値の正確な表現は、2 進浮動小数点には存在しません。現在のほとんどの浮動小数点ライブラリが提供する種類。0.1 のような数値は、精度に関係なく、2 進数として表すことはできません。

あなたが提案したことを実行できるようにするには、図書館は「手足し算」、「手割り算」と同等のことをしなければなりません。たとえば、0.1 を格納するために、ライブラリそれを文字列自体として表現し、文字列に追加を行うことを選択する場合があります。言うまでもなく、素朴な実装ではプロセスが非常に遅くなります - 桁違いに遅くなります。0.1 + 0.1 を加算するには、文字列を解析し、1+1 を加算し、キャリーを記憶し、小数点以下の位置を記憶する必要があります。これは、コンピューターのマイクロ コードが数 CPU サイクル (または単一の命令) で行うことです。 . 単一の命令の代わりに、ソフトウェア ライブラリは 100 CPU サイクル/命令のようにかかることになります。

0.1 を数値に変換しようとすると、平方 1 に戻ります。0.1 は 2 進数の数値にすることはできません。

しかし、人々は 0.1 を正確に表現する必要性を認識しています。2進数表現ではそれができないというだけです。それが新しい浮動小数点標準の出番であり、インテルの小数点ライブラリーが向かっているところです。

前の例を繰り返して、10 基数を処理できる 10 基数のコンピューターがあるとします。そのコンピュータは 1/3 を「プレーンな」浮動小数点数として格納できません。数値が 1/3 であるという表現を格納する必要があります。紙に書かれているのと同じです。10 を底とする浮動小数点数として 1/3 を紙に書いてみてください。

また、10 進数を 2 進数で正確に表現できないのはなぜですか?も参照してください。

于 2013-03-11T06:22:29.777 に答える