ホームページ >バックエンド開発 >C++ >C/C \ の `sin()` 関数と `cos()` 関数がよく知られた角度に対して不正確になるのはなぜですか?

C/C \ の `sin()` 関数と `cos()` 関数がよく知られた角度に対して不正確になるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 14:26:10501ブラウズ

Why Are C/C  's `sin()` and `cos()` Functions Inaccurate for Familiar Angles?

よく知られた角度の sin と cos からの予期しない結果

C/C の sin() 関数と cos() 関数を角度が 180 度の場合、ユーザーは予期しない結果に遭遇する可能性があります。期待値は次のとおりです:

  • sin of 0.0547
  • cos of 0.99

ただし、取得された値は、これらの期待から逸脱することがよくあります:

  • の罪3.5897934739308216e-009
  • cos of -1.00000

説明

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。