3

Javaで、最悪の場合に近づくことができる数値を計算し1e-25、それらを比較するツールに取り組んでいます。私は明らかに倍精度を使用しています。

精度以上のものを期待するべきではないという別の回答を読みました。この他の質問は、「より良い」順序で操作を順序付けするときに精度を高めることを扱っています。1e-151e-17

途中で精度が失われやすい倍精度演算はどれですか? できるだけ大きい数またはできるだけ小さい数で作業する必要がありますか? 掛け算の前に割り算をしますか?

コードはすでに十分に遅いため、クラスまたは同等のものを使用しBigDecimalたくありません;) (もちろん、速度にあまり影響しない場合を除きます)。

どんな情報でも大歓迎です!

EDIT : double は 1e-324 まで下がる可能性があるため、数値が絶対値 (1e-25) で「小さい」という事実は問題ではありません。しかし、重要なのは、それらが非常に似ている場合 (両方とも 1e-25)、比較する必要があることです。たとえば、4.64563824048517606458e-21 と 4.64563824048517606472e-21 を比較します (違いは 19 桁目と 20 桁目です)。これらの数値を計算すると、差が非常に小さいため、残りが乱数で埋められる「丸め誤差」に遭遇する可能性があります。

問題は、「この精度の損失を最小限に抑えるために計算をどのように順序付けるか」です。乗算の前に除算を行っているか、最初に加算を行っている可能性があります。

4

2 に答える 2

3

正しい答えを得ることが重要な場合は、BigDecimal を使用する必要があります。double よりは低速ですが、ほとんどの場合、十分に高速です。少なくともJavaでは、答えが正しいかどうかが問題にならないような小さな数で多くの計算を行う多くのケースは考えられません。

これが非常にパフォーマンスに敏感なアプリケーションである場合は、別の言語の使用を検討します。

于 2013-06-15T06:41:57.403 に答える
1

浮動小数点演算に関する非常に完全な記事を指摘してくれた @John に感謝します。

精度が必要な場合は、演算の順序を変更し、式を適合させて精度の低下を回避する必要があることがわかりました。これについては、「キャンセル」の章で説明しました: 互いに非常に近い数値を比較する場合 (これは私の場合です)、 「壊滅的なキャンセル」が発生し、精度が大幅に低下する可能性があります。多くの場合、数式を書き直したり、オペランド値のアプリオリな知識に従って操作を並べ替えたりすると、微積分の精度が向上します。

この記事から覚えていることは次のとおりです。

  • 2 つのほぼ同じ数量を減算するときは注意してください
  • 壊滅的なキャンセルを避けるために操作を再調整してみてください

後者の場合、コンピューティング(x - y) * (x + y)の方がより正確な結果が得られることに注意してx * x - y * yください。

于 2013-06-20T05:05:54.807 に答える