9

私がこれを正しく理解していれば、JavaScript と ActionScript 3 の両方がラジアンで動作します。

したがって、次のコードの予想される出力は次のようになります。

Math.PI                 //Expected 3.141592653589793, got 3.141592653589793

Math.sin(0)             //Expected 0, got 0
Math.sin(Math.PI/2)     //Expected 1, got 1
Math.sin(Math.PI)       //Expected 0, got 1.2246063538223773e-16
Math.sin(Math.PI*3/2)   //Expected -1, got -1
Math.sin(Math.PI*2)     //Expected 0, got -2.4492127076447545e-16

Math.cos(0)             //Expected 1, got 1
Math.cos(Math.PI/2)     //Expected 0, got 6.123031769111886e-17
Math.cos(Math.PI)       //Expected -1, got -1
Math.cos(Math.PI*3/2)   //Expected 0, got -1.836909530733566e-16
Math.cos(Math.PI*2)     //Expected 1, got 1

これは、Firefox、Chrome、Safari、および Flash Professional CS5.5 でも同じ動作です。Mac OS X 10.7.2 を使用しています。

テスト:

http://jsfiddle.net/KA4VM/

4

5 に答える 5

19

あなたが得ている値を見たことがありますか?あなたは0を期待していますが、次のようなものを得ています

0.00000000000000012246063538223773

それはあなたにとって十分にゼロに近いものではありませんか?

基本的に、入力を正確なバイナリ値として表現できない場合、バイナリ浮動小数点演算が正確であると期待するべきではありません.pi / 2は不合理であるため、表現できませ。(出力を正確に表現できない場合、入力をバイナリで正確に表現できる場合でも、結果が正確であるとは思わないでください...)

于 2011-11-08T12:59:42.553 に答える
2

Math.PI は pi を 100% 正確に表現したものではありません。単純に、pi は無理数であり、浮動小数点数は限界を超えているからです。

したがって、丸め誤差により、非常に小さな数値が得られます (数値は #.#####e-16 と #.#####e-17 で、どちらも小さい)。

それについてできることは何もありませんが、0.000000000000000006 が 0 に十分近いことを受け入れてください。

于 2011-11-08T13:01:13.600 に答える
1

したがって、1.xxxxx * 10^-16 になります。

これは 0.0000000000000001xxx (小数点以下 15 個のゼロ) になります。

0 と見なすには十分に 0 に近いと思います。

pi の値の誤差が原因で、そのごくわずかな誤差が生じます (ご存じのとおり、小数点以下は無限の桁まで伸びます)。

AS3 と JavaScript のどちらでこれを取得するかについては言及していませんが、

于 2011-11-08T13:09:00.360 に答える