5

sinl引数が pi の 0 以外の倍数に近い場合に、 が誤った結果を返すのはなぜですか? sinl引数が大きい場合に誤った結果が返されるのはなぜですか? 次のコードはそれを示しています。

変数 pi の初期化に使用される数字は、64 ビットの長さの double 値と正確に一致しないことに注意してください。コンパイラは最も近い値を選択します3.14159265358979323851280895940618620443274267017841339111328125。予想される正弦値は、libquadmath、gnu MPFR lib、またはhttp://www.ttmath.org/online_calculatorなどのオンライン計算機を使用して見つけることができます。

#include <stdio.h>
#include <math.h>

int main (int argc, char *argv [])
    {
    volatile long double pi = 3.14159265358979323846L;
    volatile long double big = 9223372035086174241L;
    volatile long double expected1 = -5.0165576126683320235E-20L;
    volatile long double expected2 = -4.2053336735954077951E-10L;
    double result;
    double ex1 = expected1, ex2 = expected2;

    result = sinl (pi);
    printf("expected: %g, \nreturned: %g\n\n", ex1, result);
    result = sinl (big);
    printf("expected: %g, \nreturned: %g\n\n", ex2, result);
    return 0;
    }

gcc 4.7.3 を使用しています。volatile を使用すると、コンパイラがsinl()呼び出しをハードコーディングされた結果に置き換えることがなくなります。私のコンピュータには Intel Core i7 プロセッサが搭載されており、Windows を実行しています。私が使用している gcc の mingw ポートは long double の出力をサポートしていないため、結果を long double ではなく double として出力しています。プログラムの出力は次のとおりです。

expected: -5.01656e-020,
returned: -5.42101e-020

expected: -4.20533e-010,
returned: -0.011874
4

3 に答える 3

3

この不正確さは、sinl ライブラリ コードで使用される fsin プロセッサ命令に起因する可能性があります。Intel が主張しているように、命令 fsin、fcos、および fptan は 1.0 ulp まで正確ではありません: http://notabs.org/fpuaccuracy/

于 2013-06-02T06:29:04.453 に答える