도 입력이 있는 sin 및 cos 함수에 대한 예기치 않은 결과
C/C sin() 및 cos() 함수를 각도에 활용하는 경우 각도로 표현하면 각도와 각도의 수학적 해석으로 인해 불일치가 발생할 수 있습니다. 라디안.
불일치의 원인
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, &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() 사용 함수:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!