알고 있는 각도에 대해 예기치 않은 결과를 나타내는 Sin 및 Cos 함수
문제:
사용 시 C/C의 cos() 및 sin() 함수와 각도 180도에서 얻은 결과는 sin(0.0547) 및 cos(0.99)와 같은 예상 값에서 크게 벗어납니다. 대신 이러한 함수는 sin(3.5897934739308216e-009) 및 cos(-1.00000)를 반환합니다.
질문 코드:
double radians = DegreesToRadians(angle); double cosValue = cos(radians); double sinValue = sin(radians);
DegreesToRadians()는 각도를 변환합니다. 을 사용하여 라디안으로 공식:
double DegreesToRadians(double degrees) { return degrees * PI / 180; }
설명:
C/C의 삼각 함수(sin(), cos(), tan() 등)에는 다음이 필요합니다. 도가 아닌 라디안으로 입력합니다. 코드에 제공된 DegreesToRadians() 함수는 PI를 상수로 활용하여 도를 라디안으로 대략적으로 변환합니다. 그러나 근사값에는 반올림 오류가 발생하고 M_PI를 사용하면 π의 수학적 값과 정확하게 일치하지 않을 수 있습니다.
또한 변환된 라디안을 sin() 및 cos() 함수에 직접 전달하면 이러한 값을 더욱 증폭시킬 수 있습니다. 오류로 인해 특정 항목에 대해 잘못된 결과가 발생함 각도.
해결책:
이 문제를 해결하려면 삼각 함수를 호출하기 전에 각도 축소를 수행할 수 있습니다. 이 기술은 각도를 -45°에서 45° 사이의 범위로 줄여 반올림 오류를 해결합니다. 예를 들어, 아래 sind() 함수를 고려해 보세요.
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; }
이 함수는 각도 감소 논리를 캡슐화하고 180도를 포함한 다양한 각도에 대해 보다 정확한 결과를 보장합니다.
위 내용은 C/C의 `sin()` 및 `cos()` 함수가 180도와 같이 알려진 각도에 대해 예상치 못한 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!