programing

cmath 단위의 sqrt, sin, cos, pow 등의 정의

newsource 2023. 7. 24. 22:32

cmath 단위의 sqrt, sin, cos, pow 등의 정의

다음과 같은 기능의 정의가 있습니까?sqrt(),sin(),cos(),tan(),log(),exp()math.h온사용 가능 ?(math.h/cmath에서 온 것들) 사용 가능합니까?

어떻게 작동하는지 알고 싶었을 뿐입니다.

이것은 흥미로운 질문이지만, 효율적인 도서관의 자료를 읽는 것은 여러분이 사용되는 방법을 알지 못하는 한 여러분을 그다지 멀리 가게 할 수 없을 것입니다.

다음은 고전적인 방법을 이해하는 데 도움이 되는 몇 가지 지침입니다.제 정보는 결코 정확하지 않습니다.다음 방법은 고전적인 방법일 뿐이며, 특정 구현에서는 다른 방법을 사용할 수 있습니다.

  • 조회 테이블이 자주 사용됩니다.
  • 삼각 함수는 종종 CORDIC 알고리즘(CPU 또는 라이브러리)을 통해 구현됩니다.일반적으로 사인과 코사인이 함께 계산된다는 점에 유의하십시오. 저는 왜 표준 C 라이브러리가 다음을 제공하지 않는지 항상 궁금했습니다.sincos기능.
  • 스퀘어 루트는 뉴턴의 방법을 몇 가지 교묘한 구현 트릭과 함께 사용합니다. 웹 어딘가에서 깜짝 놀랄만한 1/sqrt(x) 구현으로 퀘이크 소스 코드에서 추출한 것을 찾을 수 있습니다.
  • 지수 및 로그는 exp(2^n x) = exp(x)^(2^n) 및 log2(2^n x) = n + log2(x)를 사용하여 0에 가까운 인수(로그의 경우 1에 해당)를 가지며 합리적인 함수 근사치(일반적으로 파데 근사치)를 사용합니다.이와 동일한 방법으로 행렬 지수와 로그를 얻을 수 있습니다.@Stephen Canon에 따르면, 현대의 구현은 나눗셈이 곱셈보다 훨씬 느린 합리적인 함수 근사치보다 테일러 확장을 선호합니다.
  • 다른 기능들은 이러한 기능들에서 추론할 수 있습니다.구현은 전문화된 루틴을 제공할 수 있습니다.
  • pow(x, y) = exp(y * log(x)), 따라서 pow는 y가 정수일 때 사용되지 않습니다.
  • x > y인 경우 hyp(x, y) = abs(x) sqrt(1 + (y/x)^2) - 오버플로를 방지합니다.atan2합니다.sincos그리고 약간의 논리.이러한 함수는 복잡한 산술을 위한 구성 요소입니다.
  • 다른 초월 함수(감마, 에르프, 베셀, ...)에 대해서는 우수한 책 '수치 레시피', 제3판에서 아이디어를 참조하십시오.오래된 아브라모위츠 & 스테건도 유용합니다.http://dlmf.nist.gov/ 새로운 버전이 있습니다.
  • 체비셰프 근사, 연속 분수 확장(실제로 파데 근사와 관련됨) 또는 멱급수 이코노마이제이션과 같은 기술은 더 복잡한 함수에서 사용됩니다(예를 들어 erf, bessel 또는 감마의 소스 코드를 읽는 경우).저는 그들이 베어메탈 간단한 수학 함수에 진정으로 사용할 수 있을지 의심스럽지만, 누가 알겠어요.개요는 수치 레시피를 참조하십시오.

모든 구현은 다를 수 있지만 glibc의 (GNUC 라이브러리) 소스 코드에서 하나의 구현을 확인할 수 있습니다.

편집: 구글 코드 검색이 오프라인으로 전환되어 이전에 가지고 있던 링크가 사라졌습니다.

glibc의 수학 라이브러리 소스는 다음과 같습니다.

http://sourceware.org/git/ ?p=glibc.git;a=tree;f=math;h=3d5233a292f12cd9e9b9c67c3a114c64564d72ab;hb=HEAD

마법, 근사 및 조립으로 가득 찬 다양한 수학 기능을 구현하는 방법을 살펴봅니다.

fdlib 소스를 확실히 살펴보세요.fdlibm 라이브러리가 자체적으로 포함되어 있고, 각 함수가 관련된 수학에 대한 자세한 설명과 함께 잘 문서화되어 있고, 코드를 읽기에 매우 명확하기 때문에 좋습니다.

수학 코드를 많이 살펴봤기 때문에 glibc를 보지 말라고 충고하고 싶습니다. glibc 코드는 종종 따라하기가 상당히 어렵고 glibc 마법에 많이 의존합니다.FreeB의 수학 libSD는 때때로 느리지만(별로 그렇지는 않지만) 훨씬 읽기 쉽습니다.

복잡한 기능의 경우, 주요 어려움은 경계 사례입니다. 실제 기능에서는 nan/inf/0을 올바르게 처리하는 것이 이미 어렵지만 복잡한 기능에서는 악몽입니다.C99 표준은 많은 코너 케이스를 정의하며, 일부 기능에는 10-20개의 코너 케이스가 있습니다.최신 C99 표준 문서의 부록 G를 보면 아이디어를 얻을 수 있습니다.롱 더블은 포맷이 표준화되어 있지 않기 때문에 어려운 점도 있습니다. 제 경험상 롱 더블은 꽤 많은 버그를 예상해야 합니다.다가오는 IEEE 754 개정판에서 정밀도가 향상되기를 바랍니다.

대부분의 최신 하드웨어에는 이러한 기능을 매우 효율적으로 구현하는 부동 소수점 단위가 포함되어 있습니다.

용도: 루트(숫자, 루트, 깊이)

: 루트(16,2) == sqrt(16) == 4
: 루트(16,2,2) == sqrt(sqrt(16)) == 2
: 루트(64,3) == 4

C#에서 구현:

double root(double number, double root, double depth = 1f)
{
    return Math.Pow(number, Math.Pow(root, -depth));
}

용도 : Sqrt(숫자, 깊이)

: Sqrt(16) == 4
: Sqrt(8,2) == sqrt(8)

double Sqrt(double number, double depth = 1) return root(number,2,depth);

작성자: Imk0tter

언급URL : https://stackoverflow.com/questions/4541130/definitions-of-sqrt-sin-cos-pow-etc-in-cmath