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

Linda Hamilton
Lepaskan: 2024-11-24 07:00:13
asal
680 orang telah melayarinya

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);
Salin selepas log masuk

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

double DegreesToRadians(double degrees)
{
    return degrees * PI / 180;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan