C/C의 cos에 180도 각도를 적용하는 경우 () 및 sin() 함수를 사용하면 잘못된 결과가 발생할 수 있습니다. 결과가 다음과 같이 예상되므로 이는 놀라운 결과일 수 있습니다.
그러나 실제 결과는 종종 다릅니다.
이러한 불일치는 cos(a), sin(a) 및 tan(a)가 C/C에서 기능한다는 사실에서 비롯됩니다. 도가 아닌 라디안을 인수로 기대합니다. 180도에서 라디안으로 변환하면 근사값이 나올 수 있습니다.
라디안 계산이 정확하더라도 double의 유한 정밀도와 PI의 잠재적인 잘못된 표현으로 인해 결과가 여전히 다를 수 있습니다.
이 문제를 해결하려면 trig 함수를 호출하기 전에 인수를 각도 단위로 줄이는 것이 가장 좋습니다. 각도를 -45°에서 45° 사이로 제한하여 결과의 정확성을 보장합니다.
예를 들어 인수 축소를 사용하여 sin()을 각도 단위로 계산하는 다음 코드를 고려해 보세요.
#include <math.h> #include <stdio.h> static double d2r(double d) { return (d / 180.0) * ((double) M_PI); } 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; } int main(void) { int i; for (i = -360; i <= 360; i += 15) { printf("sin() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sin(d2r(i))); printf("sind() of %.1f degrees is % .*e\n", 1.0 * i, DBL_DECIMAL_DIG - 1, sind(i)); } return 0; }
이 코드는 trig 함수를 호출하기 전에 인수 감소를 수행하기 때문에 특히 여러 각도의 값에 대해 원래 접근 방식보다 더 정확한 결과를 생성합니다.
위 내용은 C/C의 cos() 및 sin() 함수가 180도와 같은 공통 각도에 대해 예기치 않은 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!