既知の角度に対して予期しない結果をもたらす 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, &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 サイトの他の関連記事を参照してください。