重複の可能性:
JavaScript の数学は壊れていますか?
そのため、3 次元ベクトルを扱う js ライブラリに取り組んでいたところ、非常に小さな精度の問題に遭遇しました。まず、以下のコードを見てください。
var a = new vec3(1, 0, 0);
var b = new vec3(1, 1, 0).normalize();
そこで、互いに正確に 45° の角度で 2 つのベクトルを作成しています (そこでvec3
標準的な数学を行うだけなので、コンストラクターは省略しました)。
これで、2 つの 3D ベクトルのドット積によって、それらの大きさと角度の余弦が乗算されることがわかりました。しかし、私がこれを行うとき:
alert(180 / Math.PI * Math.acos(a.dot(b)));
私は得る45.00000000000001
これが非常に小さな違いであることは理解していますが、事前に知らなかった場合、2 つのベクトル間の角度が 45° であるかどうかを確認できなくMath.acos(a.dot(b)) == Math.cos(Math.PI / 180 * 45)
なります。false
しかし、ベクトルをこれに変更すると、面白いことがあります。
var y = new vec3(Math.sqrt(2), Math.sqrt(2), 0).normalize();
var x = new vec3(Math.sqrt(2), 0, 0).normalize();
そして、上記と同じ計算を行うと、ちょうど 45 になります。
今、私はそれを丸めることができることを認識しています45.00000000000001
が、数学関数がより低いレベルでどのように実装されているかについての主題にはまったく慣れていないので、まったく同じ値を与えるはずの2つの計算がどのような要因で発生するのか、非常に興味がありました。微妙に違うもの。