C 수학 함수
C mathematical functionsC 표준 라이브러리(libc) |
---|
일반적인 토픽 |
기타 헤더 |
C 수학 연산은 기본 수학 [1][2]함수를 구현하는 C 프로그래밍 언어의 표준 라이브러리의 함수 그룹입니다.모든 함수는 부동소수점 숫자를 사용합니다.서로 다른 C 표준은 서로 다른 기능 세트를 제공하지만 하위 호환성이 있습니다.이러한 기능의 대부분은 C++ 표준 라이브러리에서도 사용할 수 있습니다.다만, 다른 헤더(C 헤더도 포함되어 있습니다만, 권장되지 않는 호환성 기능으로 한정됩니다).
기능의 개요
대부분의 수학적 함수는 다음과 같이 정의됩니다.<math.h>
(<cmath>
헤더(C++)를 지정합니다.다음과 같은 정수에서 작동하는 함수abs
,labs
,div
,그리고.ldiv
대신 에 정의되어 있습니다.<stdlib.h>
헤더 (<cstdlib>
헤더(C++)를 지정합니다.
각도에서 작동하는 모든 기능은 라디안을 [1]각도 단위로 사용합니다.
이 모든 기능을 표준의 C89 버전에서 사용할 수 있는 것은 아닙니다.즉, 함수는 유형만 받아들입니다.double
부동소수점 인수의 경우 코드에서 고가의 유형 변환이 이루어지며, 그렇지 않으면 단일 문자를 사용합니다.float
가치.C99 에서는, 이 단점은, 동작하는 새로운 기능 세트를 도입하는 것으로 수정되었습니다.float
그리고.long double
논쟁들.이러한 기능은 다음과 같이 식별됩니다.f
그리고.l
각각 접미사를 붙입니다.[3]
기능. | 묘사 | |
---|---|---|
abs labs llabs | 정수값의 절대값을 계산합니다. | |
fabs | 부동소수점 값의 절대값을 계산합니다. | |
div ldiv lldiv | 정수 나눗셈의 몫과 나머지를 계산합니다. | |
fmod | 부동 소수점 분할 연산의 나머지 부분 | |
remainder | 분할 작업의 나머지 부분 서명 | |
remquo | 분할 연산의 마지막 3비트뿐만 아니라 부호화된 나머지 | |
fma | 용융 곱셈 연산 | |
fmax | 2개의 부동소수점 값 중 큰 값 | |
fmin | 2개의 부동 소수점 값 중 작은 값 | |
fdim | 두 부동 소수점 값의 양의 차이 | |
nan nanf nanl | NaN을 반환한다(not-a-number). | |
지수 기능들 | exp | e를 지정된 거듭제곱으로 되돌립니다. |
exp2 | 2를 지정한 거듭제곱으로 되돌립니다. | |
expm1 | e를 지정된 거듭제곱으로 되돌립니다(-1). | |
log | 자연 로그를 계산합니다(기본값 e로). | |
log2 | 이진 로그를 계산합니다(기본값 2로). | |
log10 | 공통 로그를 계산합니다(밑수 10). | |
log1p | 자연 로그(기본값 e에 대한)에 1을 더한 값을 계산합니다. | |
ilogb | 그 숫자의 지수 추출 | |
logb | 그 숫자의 지수 추출 | |
힘 기능들 | sqrt | 제곱근을 계산하다 |
cbrt | 입방근 계산 | |
hypot | 주어진 두 숫자의 제곱합에 대한 제곱근을 계산한다 | |
pow | 소정의[4] 거듭제곱으로 수를 늘리다 | |
삼각법 기능들 | sin | 사인파 계산 |
cos | 코사인 계산 | |
tan | 탄젠트를 계산하다 | |
asin | 아크 사인 계산 | |
acos | 호 코사인 계산 | |
atan | 호 접선을 계산합니다. | |
atan2 | 기호를 사용하여 사분원을 결정하는 호 접선 계산 | |
쌍곡선 기능들 | sinh | 쌍곡선 사인 계산 |
cosh | 쌍곡 코사인 계산 | |
tanh | 쌍곡선 접선을 계산합니다. | |
asinh | 쌍곡선 아크 사인 계산 | |
acosh | 쌍곡선 호 코사인 계산 | |
atanh | 쌍곡선 호 접선을 계산합니다. | |
에러와 감마 기능들 | erf | 에러 함수를 계산합니다. |
erfc | 보완 오차 함수를 계산하다 | |
lgamma | 감마 함수의 절대값의 자연 로그를 계산합니다. | |
tgamma | 감마 함수를 계산합니다. | |
가장 가까운 정수 플로팅 지점 조작 | ceil | 지정된 값 이상의 가장 가까운 정수를 반환합니다. |
floor | 지정된 값 이하의 가장 가까운 정수를 반환합니다. | |
trunc | 지정된 값보다 크지 않은 가장 가까운 정수를 반환합니다. | |
round lround llround | 가장 가까운 정수를 반환하고 중간인 경우 0에서 반올림합니다. | |
nearbyint | 현재 반올림 모드를 사용하여 가장 가까운 정수를 반환합니다. | |
rint lrint llrint | 결과가 다를 경우 예외적으로 현재 반올림 모드를 사용하여 가장 가까운 정수를 반환합니다. | |
플로팅 지점 조작 기능들 | frexp | 숫자를 유의와 2의 거듭제곱으로 분해한다. |
ldexp | 2를 곱하여 거듭제곱하다 | |
modf | 숫자를 정수와 소수 부분으로 분해하다 | |
scalbn scalbln | 곱셈에 FLT_RADIX를 곱한다. | |
nextafter nexttoward | 지정된 값으로 다음 대표 부동소수점 값을 반환합니다. | |
copysign | 부동 소수점 값의 부호를 복사합니다. | |
분류 | fpclassify | 지정된 부동소수점 값을 분류합니다. |
isfinite | 인수의 값이 유한한지 여부를 확인합니다. | |
isinf | 인수가 무한인지 아닌지를 확인합니다. | |
isnan | 인수가 NaN인지 아닌지를 확인합니다. | |
isnormal | 인수가 정상인지 확인합니다. | |
signbit | 인수 부호가 음수인지 확인합니다. |
부동소수점 환경
C99는 부동소수점 [3]환경의 세분화된 제어를 위한 몇 가지 기능과 유형을 추가합니다.이러한 함수를 사용하여 반올림 모드 등 부동 소수점 계산에 영향을 미치는 다양한 설정을 제어할 수 있습니다. 예를 들어, 어떤 예외 상황이 발생하는지, 숫자가 0으로 플러시되는 경우 등에 사용할 수 있습니다.부동소수점 환경기능 및 유형은 에 정의되어 있습니다.<fenv.h>
헤더 (<cfenv>
C++)로 설정합니다.
기능. | 묘사 |
---|---|
feclearexcept | 예외 클리어(C99) |
fegetenv | 현재 부동소수점 환경(C99)을 저장합니다. |
fegetexceptflag | 현재 상태 플래그(C99)를 저장합니다. |
fegetround | 현재 반올림 방향(C99)을 검색합니다. |
feholdexcept | 현재 부동소수점 환경을 저장하고 모든 예외를 삭제합니다(C99) |
feraiseexcept | 부동소수점 예외 발생(C99) |
fesetenv | 현재의 부동소수점 환경을 설정합니다(C99) |
fesetexceptflag | 현재 상태 플래그 설정(C99) |
fesetround | 전류 반올림 방향 설정(C99) |
fetestexcept | 특정 예외가 발생했는지 여부를 테스트합니다(C99) |
feupdateenv | 는 부동소수점 환경을 복원하지만 현재 예외를 유지합니다(C99) |
복소수
C99에 새로운 기능이 추가되었습니다._Complex
키워드(및complex
컴비니언스 매크로)를 사용하여 복소수를 지원합니다.부동소수점 유형은 다음과 같이 수정할 수 있습니다.complex
는 부동소수점 번호의 쌍으로 정의됩니다.C99와 C++는 복잡한 번호를 코드 호환 방식으로 구현하지 않으며, 대신 C99와 C++가 클래스를 제공합니다.std::complex
.
복잡한 숫자에 대한 모든 연산은 에 정의되어 있습니다.<complex.h>
header를 클릭합니다.실제값 함수와 마찬가지로f
또는l
접미사는float complex
또는long double complex
기능의 바리안트.
기능. | 묘사 | |
---|---|---|
기본의 조작 | cabs | 절대값을 계산합니다(C99) |
carg | 복소수의 인수를 계산합니다(C99) | |
cimag | 복소수의 허수 부분을 계산합니다(C99) | |
creal | 복소수의 실제 부분을 계산합니다(C99) | |
복잡한 켤레를 계산합니다(C99) | ||
cproj | 리만 구(C99)에 대한 복잡한 투영을 계산합니다. | |
지수화 조작 | cexp | 복잡한 지수 계산(C99) |
clog | 복잡한 로그를 계산합니다(C99) | |
csqrt | 복소수 제곱근(C99)을 계산합니다. | |
cpow | 복잡한 전력을 계산한다(C99) | |
삼각법 조작 | csin | 복잡한 사인(C99)을 계산합니다. |
ccos | 복잡한 코사인(C99)을 계산합니다. | |
ctan | 복잡한 접선을 계산합니다(C99) | |
casin | 복잡한 아크 사인(C99)을 계산합니다. | |
cacos | 복소호 코사인(C99)을 계산합니다. | |
catan | 복잡한 호 접선을 계산합니다(C99) | |
쌍곡선 조작 | csinh | 복잡한 쌍곡선 사인(C99)을 계산합니다. |
ccosh | 복잡한 쌍곡선 코사인(C99)을 계산합니다. | |
ctanh | 복잡한 쌍곡선 탄젠트를 계산합니다(C99) | |
casinh | 복잡한 쌍곡선 아크 사인(C99)을 계산합니다. | |
cacosh | 복잡한 쌍곡선 호 코사인(C99)을 계산합니다. | |
catanh | 복잡한 쌍곡선 호 접선(C99)을 계산합니다. |
몇 가지 더 복잡한 기능은 "향후 [5]C99에서 사용하기 위해 예약"되어 있습니다.구현은 표준 라이브러리의 일부가 아닌 오픈 소스 프로젝트에서 제공됩니다.
기능. | 묘사 | |
---|---|---|
오류 함수 | cerf | 복잡한 에러 함수(C99)를 계산합니다. |
cerfc | 복잡한 보완 오류 함수(C99)를 계산합니다. |
유형 일반 함수
머리글<tgmath.h>
에 정의되어 있는 각 수학적 함수에 대해 활자 변환 매크로를 정의합니다.<math.h>
그리고.<complex.h>
수학 함수의 함수 오버로드에 대한 제한된 지원이 추가됩니다. 동일한 함수 이름을 다른 유형의 파라미터와 함께 사용할 수 있습니다. 실제 함수는 파라미터의 유형에 따라 컴파일 시 선택됩니다.
실수와 복소수 양쪽에 정의되어 있는 함수에 대응하는 각 타입 제네릭매크로에는 총 6개의 다른 함수가 캡슐화되어 있습니다.float
,double
그리고.long double
, 및 그complex
변종입니다.실수에 대해서만 정의되어 있는 함수에 대응하는 타입 제네릭매크로에는 총 3개의 다른 함수가 캡슐화되어 있습니다.float
,double
그리고.long double
기능의 변형입니다.
C++ 언어에는 함수 오버로드에 대한 네이티브 지원이 포함되어 있기 때문에 C++ 언어에는<tgmath.h>
호환성 기능으로도 사용할 수 있습니다.
난수생성
머리글<stdlib.h>
(<cstdlib>
C++)에서는 통계적으로 난수 생성에 [6]사용할 수 있는 몇 가지 함수를 정의합니다.
기능. | 묘사 |
---|---|
rand | 0에서 0 사이의 의사 소숫자를 생성합니다.RAND_MAX , 포함. |
srand | 유사 주파수 생성기를 초기화합니다. |
arc4random | 0에서 0 사이의 의사 소숫자를 생성합니다.UINT32_MAX (일반적으로 보다 뛰어난 알고리즘을 사용)rand |
arc4random_uniform | 는 0 ~ 최대값의 의사 소숫자를 생성합니다. |
arc4random_buf | 버퍼에 유사 대역폭 비트스트림을 채웁니다. |
arc4random_stir | 에 의해 의사 패킷 번호 생성기가 초기화됩니다. |
그arc4random
난수 함수의 패밀리는 POSIX 표준에서 정의되지 않지만 일부 공통에서 발견됩니다.libc
실장.RC4 암호의 유출된 버전의 키스트림 생성기(따라서 "alleged RC4")를 의미했지만, ChaCha20과 같은 다른 암호와 같은 다른 알고리즘이 같은 이름을 사용한 이후 구현되었습니다.
랜덤의 품질은rand
통계적으로 무작위로 고려되기에는 대개 너무 약하며, 명시적 시딩이 필요하다.일반적으로는 다음을 사용하는 것이 좋습니다.arc4random
대신rand
가능한 한.일부 C 라이브러리는rand
사용.arc4random_uniform
내부적으로
실장
Linux 및 BSD와 같은 POSIX 시스템에서 수학 함수는 (에서 선언한 바와 같이)<math.h>
)는 수학 라이브러리에 별도로 번들되어 있습니다.libm
따라서 이러한 함수 중 하나를 사용할 경우 링커에는 명령어가 부여되어야 합니다.-lm
여러 가지가 있습니다.libm
다음을 포함한 구현:
- GNU libc의 libm
- AMD의 libm
- 레드햇의 libm
- FreeB의 기반으로 사용된 Sun의 FDLIBMSD의 msun 및 OpenBSD의 libm은 둘 다 Julia의 OpenLibm의 기반이 되었습니다.
- BSD libms 및 ARM 등의 기타 프로젝트에 기반한 musl의 libm
- 아레네 프로젝트의 CRibm(정확하게 반올림된 libm)과 후속 MetaLibm.Remez 알고리즘을 사용하여 공식적으로 입증된 근사치를 자동으로 생성합니다.
반드시 다음 이름으로 구현해야 하는 것은 아닙니다.libm
다음을 포함합니다.
- ARM의 최적화된 연산 루틴
- GCE-Math는 C++용으로 작성된 C/C++ 함수 버전입니다.
constexpr
(시간 계산) - SIMD(벡터화) 연산 라이브러리에는 SLEEF, Yeppp! 및 Agner Fog의 VCL과 더불어 SVML [7]및 DirectXMath와 같은 몇 가지 클로즈드 소스 라이브러리가 포함됩니다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b ISO/IEC 9899:1999 specification (PDF). p. 212, § 7.12.
- ^ Prata, Stephen (2004). C primer plus. Sams Publishing. Appendix B, Section V: The Standard ANSI C Library with C99 Additions. ISBN 0-672-32696-5.
- ^ a b Prata, Stephen (2004). C primer plus. Sams Publishing. Appendix B, Section VIII: C99 Numeric Computational Enhancements. ISBN 0-672-32696-5.
- ^ 통지로 볼 때 정사각형이나 큐브를 계산하려면 pow(x,2) 또는 pow(x,3)를 사용하는 것이 편리해 보일 수 있습니다.단, 이는 시간 크리티컬코드에서는 권장되지 않습니다.구현이 컴파일 시 이러한 케이스에 특별히 대응하지 않는 한 x*x 또는 x*x*x는 훨씬 빠르게 실행됩니다.또한 sqrt(x) 및 cbrt(x)는 pow(x,.5) 또는 pow(x,1.3)보다 우선해야 합니다.
- ^ man cerf(3), man cerfc(3), 예를 들어 https://linux.die.net/man/3/cerf를 참조하십시오.
- ^ "The GNU C Library – ISO Random". Retrieved 18 July 2018.
- ^ Cordes, Peter. "intel - Where is Clang's '_mm256_pow_ps' intrinsic?". Stack Overflow.
외부 링크
- 단일 UNIX 사양, 개방형 그룹의 버전 4 : 수학적 선언 – 기본 정의 참조,
- 산술 함수에 대한 C 기준