1

そのため、計算を行うプログラムを書いていたところ、期待した結果が得られていないことに気付きました。

私は Math.acos() および Math.sqrt() 関数を使用しています。ゼロの答えが得られることを期待すると、信じられないほど小さなほぼゼロの答えが得られます。

> System.out.println(Math.acos(27441738 / (Math.sqrt(27441738)*Math.sqrt(27441738))));
1.4901161193847656E-8

通常、これは 0.0 を出力するはずです。私がここに欠けているものはありますか?

4

1 に答える 1

1

浮動小数点演算を含む式のエラーを絞り込むための一般的な規則はありません。

この特定のケースでは、分数の合理化を利用してエラーを大幅に軽減できます。

                                              -------------
        x        x     1     x     1    √x    |  x    √x  |
 1 = -------- = --- * --- = --- * --- * --- = | --- * --- |  
     √x * √x    √x     √x   √x    √x    √x    | √x     x  |
                                              -------------

新しい式の評価 ( を使用bsh):

System.out.println( Math.acos( (27441738 / Math.sqrt(27441738)) * (Math.sqrt(27441738) / 27441738) ) );

版画:

0.0

他の人が FP に関する情報を取得するための良い出発点を指摘しているように、提案された読書についてのことは、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」であり、浮動小数点演算の詳細な論文ですが、私はコンピューター表現のほうが好きですNumbers and Computer Arithmeticは、より単純でより教育的であり、浮動小数点演算の複雑な概念を紹介するおもちゃの fp システムから始まります。

于 2013-09-06T20:58:41.867 に答える