1
java.lang.Math
を使用して、多くの三角関数を扱うJavaクラスがあります。次のコードは、0度と180度の平均方向を決定します。 0度と180度が反対方向であり、互いに打ち消しあうため、結果はNaNになります。しかし、私がやるとき:三角関数を扱うときの浮動小数点精度
double[] angles = {0, 180};
double sines = 0;
double cosines = 0;
double avg;
for (int i = 0; i < angles.length; i++) {
double rad = Math.toRadians(angles[i]);
sines += Math.sin(rad);
cosines += Math.cos(rad);
}
double sin = sines/angles.length;
double cos = cosines/angles.length;
System.out.println("Avg sin: " + sin + "\nAvg cos: " + cos); // sin != 0 but it should
double avgRad = Math.atan2(sin, cos);
avg = Math.toDegrees(avgRad);
System.out.println("Average: " + avg);
avg
が90.0
代わりのNaN
等しいです。これは、180度と0度の平均正弦は、(浮動小数点精度の仕組みのため)非常に小さいが正の数になります。上記のコードを実行すると、私の言いたいことがわかります。この精度の欠如を避けるにはどうすればよいですか?平均的なサインとコサインだけでなく、最終的な結果を丸めることができることを知っていますが、それは私にはやや不愉快なようです。
浮動小数点数は丸め誤差の影響を受けやすいです。それと一緒に生きる。 – Mick
私はそれが分かっています。私はそれを回避する方法を求めています。 – Kootling
あなたは正確に何をしようとしていますか? – Mick