> 백엔드 개발 > C++ > C/C의 `sin()` 및 `cos()` 함수가 180도와 같이 알려진 각도에 대해 예상치 못한 결과를 생성하는 이유는 무엇입니까?

C/C의 `sin()` 및 `cos()` 함수가 180도와 같이 알려진 각도에 대해 예상치 못한 결과를 생성하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-24 07:00:13
원래의
750명이 탐색했습니다.

Why are C/C  's `sin()` and `cos()` functions producing unexpected results for known angles like 180 degrees?

알고 있는 각도에 대해 예기치 않은 결과를 나타내는 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, &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿