익숙한 각도에서 sin 및 cos의 예상치 못한 결과
C/C의 sin() 및 cos() 함수를 180도 각도에서는 사용자가 예상치 못한 결과를 겪을 수 있습니다. 예상 값은 다음과 같습니다.
그러나 얻은 값은 종종 이러한 기대에서 벗어나는 경우가 있습니다.
설명
C/C의 sin() 및 cos() 함수가 작동합니다. 각도가 아닌 라디안을 입력 매개변수로 사용합니다. DegreesToRadians()는 각도를 라디안으로 변환하려고 시도하지만 반올림 부정확성과 제한된 double() 정밀도로 인해 결과에 불일치가 발생할 수 있습니다. 또한 수학 상수 π의 추정치인 기계 상수 M_PI가 이러한 편차의 원인이 될 수 있습니다.
해결책
이러한 부정확성을 해결하려면 다음을 수행하는 것이 좋습니다. 삼각 함수를 호출하기 전에 각도를 각도로 줄입니다. 여기에는 sin()을 호출하기 전에 각도를 -45°에서 45° 범위 내로 줄이는 것이 포함됩니다. 이렇게 하면 sin(90.0*N)과 같은 계산에서 큰 N 값이 -1.0, 0.0 및 1.0의 정확한 결과를 생성할 수 있습니다.
이 접근 방식을 보여주는 샘플 코드가 제공됩니다.
#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: return sin(d2r(x90)); case 1: return cos(d2r(x90)); case 2: return sin(d2r(-x90)); case 3: return -cos(d2r(x90)); } return 0.0; }
이 업데이트된 코드는 출력에서 알 수 있듯이 다양한 각도에 대해 더 정확한 결과를 생성합니다.
sin() of -90.0 degrees is 2.4492935982947064e-16 sind() of -90.0 degrees is -0.0000000000000000e+00 sin() of -120.0 degrees is -7.0710678118654752e-01 sind() of -120.0 degrees is -7.0710678118654746e-01 sin() of -135.0 degrees is -0.70710678118654757 sind() of -135.0 degrees is -0.70710678118654762 sin() of -150.0 degrees is -2.4492935982947064e-16 sind() of -150.0 degrees is -0.0000000000000000e+00 sin() of -180.0 degrees is 2.4492935982947064e-16 sind() of -180.0 degrees is -0.0000000000000000e+00
위 내용은 C/C의 `sin()` 및 `cos()` 함수가 익숙한 각도에서 부정확한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!