ホームページ  >  記事  >  バックエンド開発  >  C/C の `sin()` 関数と `cos()` 関数が 180 度などの既知の角度に対して予期しない結果を生成するのはなぜですか?

C/C の `sin()` 関数と `cos()` 関数が 180 度などの既知の角度に対して予期しない結果を生成するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-24 07:00:13708ブラウズ

Why are C/C  's `sin()` and `cos()` functions producing unexpected results for known angles like 180 degrees?

既知の角度に対して予期しない結果をもたらす Sin 関数と Cos 関数

問題:

を使用する場合角度を指定した C/C の cos() および sin() 関数180 度の場合、得られる結果は、sin(0.0547) や cos(0.99) など、予想値から大きく外れます。代わりに、これらの関数は sin(3.5897934739308216e-009) と cos(-1.00000) を返します。

問題のコード:

double radians = DegreesToRadians(angle);
double cosValue = cos(radians);
double sinValue = sin(radians);

ここで DegreesToRadians() は度を変換しますを使用してラジアンに変換します式:

double DegreesToRadians(double degrees)
{
    return degrees * PI / 180;
}

説明:

C/C の三角関数 (sin()、cos()、tan() など) には、度ではなくラジアンで入力します。コードで提供されている DegreesToRadians() 関数は、PI を定数として利用して、度をラジアンに近似変換します。ただし、近似では丸め誤差が生じ、M_PI の使用は π の数学的値と正確に一致しない可能性があります。

さらに、変換されたラジアンを直接 sin() 関数と cos() 関数に渡すと、これらの値がさらに増幅される可能性があります。エラーが発生し、特定の場合に不正確な結果が生じる角度。

解決策:

この問題に対処するには、三角関数を呼び出す前に角度の縮小を度単位で実行できます。この手法では角度を -45° ~ 45° の範囲に縮小し、丸め誤差に対処します。たとえば、以下の sind() 関数について考えてみましょう。

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, &amp;quo);
  switch (quo % 4) {
    case 0:
      // Use * 1.0 to avoid -0.0
      return sin(d2r(x90)* 1.0);
    case 1:
      return cos(d2r(x90));
    case 2:
      return sin(d2r(-x90) * 1.0);
    case 3:
      return -cos(d2r(x90));
  }
  return 0.0;
}

この関数は、角度削減ロジックをカプセル化し、180 度を含むさまざまな角度に対してより正確な結果を保証します。

以上がC/C の `sin()` 関数と `cos()` 関数が 180 度などの既知の角度に対して予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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