ホームページ > バックエンド開発 > C++ > C/C の `sin()` 関数と `cos()` 関数で度数を使用すると予期しない結果が生じるのはなぜですか?

C/C の `sin()` 関数と `cos()` 関数で度数を使用すると予期しない結果が生じるのはなぜですか?

DDD
リリース: 2024-11-29 20:37:12
オリジナル
260 人が閲覧しました

Why Do C/C  's `sin()` and `cos()` Functions Produce Unexpected Results When Using Degrees?

度を入力した sin 関数と cos 関数の予期しない結果

角度に対して C/C sin() 関数と cos() 関数を使用する場合度数で表されるため、度数と度数の数学的解釈から矛盾が生じる可能性があります。 radians.

不一致の原因

C/C の sin() 関数と cos() 関数は、角度をラジアンで受け入れるように設計されています。ただし、その後 DegreesToRadians() 関数を使用して度をラジアンに変換すると、丸めと double データ型の有限精度制限による固有の近似が導入されます。さらに、M_PI を使用すると、π の数学的定義からわずかに逸脱する可能性があります。

数学的解釈

sin(0.0547) = 0.0547
cos(0.0547) ) = 0.9984

度で表すと、

sin(0.0547) = sin(0.0547 × 180 / π) ≈ 0.0031
cos(0.0547) = cos(0.0547 × 180 / π) ≈ 0.9995

この不一致に対処するには、三角関数を呼び出す前に角度を度単位で減らすことをお勧めします。この手法により、-45° ~ 45° の範囲内の精度が保証されます。

#define M_PIf (3.14159265358979323846)
#include <stdio.h>

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

double sind(double x)
{
  if (x < 0.0)
  {
    return -sind(-x);
  }

  int quo;
  double x90 = remquo(fabs(x), 90.0, &amp;quo);
  switch (quo % 4)
  {
  case 0:
    return sin(DegreesToRadians(x90));
  case 1:
    return cos(DegreesToRadians(x90));
  case 2:
    return sin(DegreesToRadians(-x90));
  case 3:
    return -cos(DegreesToRadians(x90));
  }
}
ログイン後にコピー

サンプル出力

改良された sind() の使用function:

printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0)));
printf("sind() of 180.0 degrees: %f\n", sind(180.0));
ログイン後にコピー

出力

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00
ログイン後にコピー

この出力は、角度で指定された sin() 関数と cos() 関数の正確な結果を示します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート