よく知られた角度の sin と cos からの予期しない結果
C/C の sin() 関数と cos() 関数を角度が 180 度の場合、ユーザーは予期しない結果に遭遇する可能性があります。期待値は次のとおりです:
ただし、取得された値は、これらの期待から逸脱することがよくあります:
説明
C/C の sin() 関数と cos() 関数が動作します度ではなくラジアンを入力パラメータとして使用します。 DegreesToRadians() は度をラジアンに変換しようとしますが、丸めの不正確さと double() の精度の制限により、結果に不一致が生じる可能性があります。さらに、数学定数 π の推定値である機械定数 M_PI が、これらの偏差に寄与する可能性があります。
解決策
これらの不正確さに対処するには、以下を実行することをお勧めします。三角関数を呼び出す前に角度を度単位で縮小します。これには、sin() を呼び出す前に角度を -45° ~ 45° の範囲内に減らすことが含まれます。これにより、sin(90.0*N) のような計算における N の大きな値が、-1.0、0.0、および 1.0 の正確な結果を生成することが保証されます。
このアプローチを示すサンプル コードが提供されています。
#include <math.h> #include <stdio.h> static double d2r(double d) { return (d / 180.0) * ((double) M_PI); } double sind(double x) { if (!isfinite(x)) { return sin(x); } if (x < 0.0) { return -sind(-x); } int quo; double x90 = remquo(fabs(x), 90.0, &quo); switch (quo % 4) { case 0: return sin(d2r(x90)); case 1: return cos(d2r(x90)); case 2: return sin(d2r(-x90)); case 3: return -cos(d2r(x90)); } return 0.0; }
この更新されたコードは、出力で示されているように、さまざまな角度に対してより正確な結果を生成します:
sin() of -90.0 degrees is 2.4492935982947064e-16 sind() of -90.0 degrees is -0.0000000000000000e+00 sin() of -120.0 degrees is -7.0710678118654752e-01 sind() of -120.0 degrees is -7.0710678118654746e-01 sin() of -135.0 degrees is -0.70710678118654757 sind() of -135.0 degrees is -0.70710678118654762 sin() of -150.0 degrees is -2.4492935982947064e-16 sind() of -150.0 degrees is -0.0000000000000000e+00 sin() of -180.0 degrees is 2.4492935982947064e-16 sind() of -180.0 degrees is -0.0000000000000000e+00
以上がC/C \ の `sin()` 関数と `cos()` 関数がよく知られた角度に対して不正確になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。