>백엔드 개발 >C++ >C/C의 `sin()` 및 `cos()` 함수가 익숙한 각도에서 부정확한 이유는 무엇입니까?

C/C의 `sin()` 및 `cos()` 함수가 익숙한 각도에서 부정확한 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-05 14:26:10501검색

Why Are C/C  's `sin()` and `cos()` Functions Inaccurate for Familiar Angles?

익숙한 각도에서 sin 및 cos의 예상치 못한 결과

C/C의 sin() 및 cos() 함수를 180도 각도에서는 사용자가 예상치 못한 결과를 겪을 수 있습니다. 예상 값은 다음과 같습니다.

  • sin of 0.0547
  • cos of 0.99

그러나 얻은 값은 종종 이러한 기대에서 벗어나는 경우가 있습니다.

  • 죄 3.5897934739308216e-009
  • cos of -1.00000

설명

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.