9

Windows 7 PC で Java を使用し (それが問題かどうかは不明)、0 を返す必要がある値 (pi/2 など) で Math.cos() を呼び出すと、代わりに小さな値が返されますが、私が誤解していない限り、小さな値はゼロから 1 ulp をはるかに超えています。

Math.cos(Math.PI/2) = 6.123233995736766E-17
Math.ulp(Math.cos(Math.PI/2)) = 1.232595164407831E-32

これは実際には 1 ulp 以内で、私は単に混乱していますか? そして、これは、このマイナーな不正確さを解決するための受け入れ可能なラッパー メソッドでしょうか?

public static double cos(double a){
    double temp = Math.abs(a % Math.PI);
    if(temp == Math.PI/2)
        return 0;
    return Math.cos(a);
}
4

3 に答える 3

11

Math.PI/2近似値であることを忘れないでください。正確にpi/2 にはならないので、 の結果はcos(Math.PI/2)正確に 0 にはなりませMath.cosMath.PI/2

于 2010-02-10T09:36:17.920 に答える
7

==doubleでは絶対に使用しないでください。常に誤差範囲内で行う必要があります。私に言わせれば、10 -17は良い精度です。2.220446049250313E-16 は 10 0の大きさの数値の精度であるため、10 -32の Ulp 数値は10 -17の大きさの double の精度です。

于 2010-02-10T09:46:01.167 に答える
2

これは、開始時の一般的なエラーです。このリンクには、その理由に関する非常に技術的な議論があります。 http://docs.sun.com/source/806-3568/ncg_goldberg.html

しかし、最も単純な形式では、10 進法で 1/3 を正確に表現できないのと同じように、2 進法で正確に表現できない値があります。

于 2010-02-10T09:51:54.090 に答える