Rumah >pembangunan bahagian belakang >C++ >Mengapakah Fungsi `sin()` dan `cos()` C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Menggunakan Darjah?

Mengapakah Fungsi `sin()` dan `cos()` C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Menggunakan Darjah?

DDD
DDDasal
2024-11-29 20:37:12179semak imbas

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

Keputusan Tidak Dijangka untuk sin dan cos Fungsi dengan Input Darjah

Apabila menggunakan fungsi C/C sin() dan cos() untuk sudut dinyatakan dalam darjah, percanggahan mungkin timbul daripada tafsiran matematik darjah berbanding radian.

Punca Percanggahan

Fungsi sin() dan cos() C/C direka bentuk untuk menerima sudut dalam radian. Walau bagaimanapun, penggunaan seterusnya bagi fungsi DegreesToRadians() untuk menukar darjah kepada radian memperkenalkan anggaran yang wujud disebabkan oleh pembundaran dan had ketepatan terhingga jenis data berganda. Selain itu, penggunaan M_PI mungkin menyebabkan sedikit penyelewengan daripada takrif matematik π.

Tafsiran Matematik

sin(0.0547) = 0.0547
cos(0.054> ) = 0.9984

Apabila dinyatakan dalam darjah:

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

Penyelesaian

Untuk menangani percanggahan ini, kami mengesyorkan mengurangkan sudut dalam darjah sebelum menggunakan fungsi trigonometri. Teknik ini memastikan ketepatan dalam julat -45° hingga 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));
  }
}

Sampel Output

Menggunakan sind() yang dipertingkatkan fungsi:

printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0)));
printf("sind() of 180.0 degrees: %f\n", sind(180.0));

Output

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00

Output ini menunjukkan hasil yang tepat untuk fungsi sin() dan cos() dengan sudut diberikan dalam darjah.

Atas ialah kandungan terperinci Mengapakah Fungsi `sin()` dan `cos()` C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Menggunakan 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