> 백엔드 개발 > C++ > 각도를 사용할 때 C/C의 `sin()` 및 `cos()` 함수가 예상치 못한 결과를 생성하는 이유는 무엇입니까?

각도를 사용할 때 C/C의 `sin()` 및 `cos()` 함수가 예상치 못한 결과를 생성하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-29 20:37:12
원래의
254명이 탐색했습니다.

Why Do C/C  's `sin()` and `cos()` Functions Produce Unexpected Results When Using Degrees?

도 입력이 있는 sin 및 cos 함수에 대한 예기치 않은 결과

C/C sin() 및 cos() 함수를 각도에 활용하는 경우 각도로 표현하면 각도와 각도의 수학적 해석으로 인해 불일치가 발생할 수 있습니다. 라디안.

불일치의 원인

C/C의 sin() 및 cos() 함수는 각도를 라디안 단위로 허용하도록 설계되었습니다. 그러나 이후에 DegreesToRadians() 함수를 사용하여 각도를 라디안으로 변환하면 반올림 및 double 데이터 유형의 유한 정밀도 제한으로 인해 고유한 근사치가 도입됩니다. 또한 M_PI를 사용하면 π의 수학적 정의에서 약간의 편차가 발생할 수 있습니다.

수학적 해석

sin(0.0547) = 0.0547
cos(0.0547 ) = 0.9984

도로 표현하는 경우:

sin(0.0547) = sin(0.0547 × 180 / π) ≒ 0.0031
cos(0.0547) = cos(0.0547 × 180 / π) ≒ 0.9995

해결 방법

이러한 불일치를 해결하려면 삼각 함수를 호출하기 전에 각도를 도 단위로 줄이는 것이 좋습니다. 이 기술은 -45° ~ 45° 범위 내에서 정밀도를 보장합니다.

#define M_PIf (3.14159265358979323846)
#include <stdio.h>

double DegreesToRadians(double degrees)
{
  return degrees * M_PIf / 180;
}

double sind(double x)
{
  if (x < 0.0)
  {
    return -sind(-x);
  }

  int quo;
  double x90 = remquo(fabs(x), 90.0, &amp;quo);
  switch (quo % 4)
  {
  case 0:
    return sin(DegreesToRadians(x90));
  case 1:
    return cos(DegreesToRadians(x90));
  case 2:
    return sin(DegreesToRadians(-x90));
  case 3:
    return -cos(DegreesToRadians(x90));
  }
}
로그인 후 복사

샘플 출력

향상된 sind() 사용 함수:

printf("sin() of 180.0 degrees: %f\n", sin(DegreesToRadians(180.0)));
printf("sind() of 180.0 degrees: %f\n", sind(180.0));
로그인 후 복사

출력

sin() of 180.0 degrees: -1.2246467991474805e-16
sind() of 180.0 degrees: -0.0000000000000000e+00
로그인 후 복사

이 출력은 각도가 각도로 지정된 sin() 및 cos() 함수에 대한 정확한 결과를 보여줍니다.

위 내용은 각도를 사용할 때 C/C의 `sin()` 및 `cos()` 함수가 예상치 못한 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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