> 백엔드 개발 > C++ > C/C의 cos() 및 sin() 함수가 180도와 같은 공통 각도에 대해 예기치 않은 결과를 생성하는 이유는 무엇입니까?

C/C의 cos() 및 sin() 함수가 180도와 같은 공통 각도에 대해 예기치 않은 결과를 생성하는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-27 12:00:16
원래의
730명이 탐색했습니다.

Why Do C/C  's cos() and sin() Functions Produce Unexpected Results for Common Angles Like 180 Degrees?

익숙한 각도에 대한 C/C의 cos() 및 sin()의 예기치 않은 결과

C/C의 cos에 180도 각도를 적용하는 경우 () 및 sin() 함수를 사용하면 잘못된 결과가 발생할 수 있습니다. 결과가 다음과 같이 예상되므로 이는 놀라운 결과일 수 있습니다.

  • sin of 0.0547
  • cos of 0.99

그러나 실제 결과는 종종 다릅니다.

  • 죄 3.5897934739308216e-009
  • cos of -1.00000

이러한 불일치는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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