Java を使用して「数計算」を学習するのに最適なリソースは何ですか? Java を使用して数値処理をコーディングする際の、10 進数処理の正しい方法、ベスト プラクティス、API、パフォーマンスに関する注目すべきイディオム、および一般的な落とし穴 (およびその解決策) などについて言及しています。
2 に答える
まず、浮動小数点演算について学ぶ必要があります。float
これはJavaに固有のものではありませんが、たとえば、やなどのJavaプリミティブを使用しても問題がない場合など、後で情報に基づいた決定を行うことができますdouble
。関連するトピックは次のとおりです(私が科学計算を受講したコースからコピー):
- エラーの原因:丸め、切り捨てエラー、不完全な収束、統計エラー、プログラムのバグ。
- コンピューターの浮動小数点演算とIEEE標準。
- キャンセルによるエラー増幅。
- コンディショニング、条件数、およびエラー増幅。
BigDecimal
これにより、Javaなどを使用するかどうかを決定できます。これについては、すでにBigInteger
多くの質問と回答があります。
次に、CPUとメモリの両方を含むパフォーマンスを達成します。「多くのオートボクシングは深刻なパフォーマンスの問題です」など、さまざまな経験則が見つかるでしょう。しかし、いつものように、最善の方法は、独自のアプリケーションのプロファイルを作成することです。たとえば、読みやすさに影響を与える場合でも、最適化が重要であると誰かが主張したとします。その最適化がアプリケーションにとって重要でない場合は、実行しないでください。
最後に、可能であれば、数値的なもののためにライブラリを使用することはしばしば報われます。最初の試みは、おそらく既存のライブラリよりも遅く、バグが多いでしょう。たとえば、念のため、独自の線形計画法ルーチンを実装しないでください。
この質問は少しオープンエンドであり、解釈の余地があるようです。そういうわけで、私は2つの短いことだけを与えます.
1) 10 進精度 - 2 つの浮動小数点数 (または倍精度浮動小数点数) が等しいと想定しないでください。まったく同じ手順で両方を計算したとしてもです。さまざまな状況での丸めに関する多くの問題により、10 進数が正確に期待どおりであることを確信できないことがよくあります。実行しdouble myNumber = calculateMyNumber()
てから一連のことを実行してからそれに戻って を確認するとif(myNumber == calculateMyNumber()
、calculateMyNumber() で実行された計算を変更していなくても、その評価は false になる可能性があります。
2) 追跡できる数値のサイズと精度には制限があります。int myNumber = 2000000000
とがある場合if(myNumber*2 < myNumber)
、実際には true と評価されます。myNumber*2 は myNumber よりも小さい数値になるためです。これは、数値に割り当てられたメモリがそれほど大きな数値を保持するのに十分な大きさではなく、オーバーフローして小さくなるためです。以前より。BigIntegerやBigDecimalなど、大きな数値をカプセル化するクラスを調べます。
数値のコンピューター表現、または数値の 2 進数表現を調べると、このようなことが副作用としてわかります。