Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah fungsi `sin()` dan `cos()' C/C menghasilkan hasil yang tidak dijangka untuk sudut yang diketahui seperti 180 darjah?

Mengapakah fungsi `sin()` dan `cos()' C/C menghasilkan hasil yang tidak dijangka untuk sudut yang diketahui seperti 180 darjah?

Linda Hamilton
Linda Hamiltonasal
2024-11-24 07:00:13681semak imbas

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

Fungsi Dosa dan Cos Menghasilkan Keputusan Tidak Dijangka untuk Sudut Diketahui

Isu:

Apabila menggunakan C/C 's cos() dan sin() berfungsi dengan sudut 180 darjah, keputusan yang diperolehi menyimpang dengan ketara daripada nilai yang dijangkakan, seperti sin(0.0547) dan cos(0.99). Sebaliknya, fungsi ini mengembalikan sin(3.5897934739308216e-009) dan cos(-1.00000).

Kod dalam Soalan:

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

Di mana Darjah()Menukar DarjahKeRadian kepada radian menggunakan formula:

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

Penjelasan:

Fungsi trigonometri C/C (sin(), cos(), tan(), dll.) memerlukannya input dalam radian dan bukannya darjah. Fungsi DegreesToRadians() yang disediakan dalam kod menawarkan anggaran penukaran darjah kepada radian, menggunakan PI sebagai pemalar. Walau bagaimanapun, penghampiran memperkenalkan ralat pembundaran dan penggunaan M_PI mungkin tidak sejajar dengan tepat dengan nilai matematik π.

Selain itu, menghantar radian yang ditukar terus kepada fungsi sin() dan cos() boleh menguatkan lagi ini ralat, yang membawa kepada keputusan yang salah pastinya sudut.

Penyelesaian:

Untuk menangani isu ini, pengurangan sudut dalam darjah boleh dilakukan sebelum memanggil fungsi trigonometri. Teknik ini mengurangkan sudut kepada julat antara -45° dan 45°, menangani ralat pembundaran. Sebagai contoh, pertimbangkan fungsi sind() di bawah:

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;
}

Fungsi ini merangkumi logik pengurangan sudut dan memastikan hasil yang lebih tepat untuk pelbagai sudut, termasuk 180 darjah.

Atas ialah kandungan terperinci Mengapakah fungsi `sin()` dan `cos()' C/C menghasilkan hasil yang tidak dijangka untuk sudut yang diketahui seperti 180 darjah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn