Search

<math.h>

Created
2021/04/06
tag
C
math.h
cmath

Subjects

β€’
<math.h>μ—λŠ” μˆ˜ν•™μ  μ—°μ‚°κ³Ό κ΄€λ ¨λœ λ§Žμ€ ν•¨μˆ˜λ“€μ΄ μ‘΄μž¬ν•œλ‹€. μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λ©΄ λΉ„μŠ·ν•œ μ΄λ¦„λ“€μ˜ ν•¨μˆ˜κ°€ μ—¬λŸΏ λ¬Άμ—¬ μžˆλŠ” 것을 λ³Ό 수 μžˆλŠ”λ°, μ΄λŠ” C 언어에 C++μ—μ„œμ˜ μ˜€λ²„λ‘œλ”© κΈ°λŠ₯이 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. C μ–Έμ–΄μ—μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•  λ•ŒλŠ” λ°›λŠ” μΈμžκ°€ λ‹€λ₯΄λ”라도 λ™μΌν•œ ν•¨μˆ˜ 이름을 μ‚¬μš©ν•  수 μ—†λ‹€. λ”°λΌμ„œ λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λ“€μž„μ—λ„ λ°›λŠ” μΈμžμ— λ”°λΌμ„œ ν•¨μˆ˜μ˜ 이름을 μ‘°κΈˆμ”© λ‹€λ₯΄κ²Œ λ‘” 것이닀. λ”°λΌμ„œ <math.h>λ₯Ό λœ―μ–΄λ³΄λ©΄ μ•„λž˜μ— 주어진 ν•¨μˆ˜λ“€μ΄ ν•¨μˆ˜ 이름 끝에 fκ°€ 뢙은 것, ν•¨μˆ˜ 이름 끝에 l이 뢙은 것, 아무 것도 뢙지 μ•Šμ€ κ²ƒλ“€λ‘œ 각 3κ°œμ”© μ‘΄μž¬ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.
β€’
ν•¨μˆ˜ 이름 끝에 fκ°€ 뢙은 것 : ν•¨μˆ˜μ˜ 인자둜 float νƒ€μž…μ„ λ°›λŠ”λ‹€.
원 ν•¨μˆ˜ 이름에 λ³„λ„μ˜ λͺ…μ‹œκ°€ μ—†λ‹€λ©΄ λ°˜ν™˜ νƒ€μž…λ„ float이닀.
β€’
ν•¨μˆ˜ 이름 끝에 l이 뢙은 것 : ν•¨μˆ˜μ˜ 인자둜 long double νƒ€μž…μ„ λ°›λŠ”λ‹€.
원 ν•¨μˆ˜ 이름에 λ³„λ„μ˜ λͺ…μ‹œκ°€ μ—†λ‹€λ©΄ λ°˜ν™˜ νƒ€μž…λ„ float이닀.
β€’
ν•¨μˆ˜ 이름 끝에 아무 것도 뢙지 μ•Šμ€ 것 : ν•¨μˆ˜μ˜ 인자둜 double νƒ€μž…μ„ λ°›λŠ”λ‹€.
원 ν•¨μˆ˜ 이름에 λ³„λ„μ˜ λͺ…μ‹œκ°€ μ—†λ‹€λ©΄ λ°˜ν™˜ νƒ€μž…λ„ float이닀.
라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ λ°œμƒν•œ ErrorλŠ” math_errhandlingμ΄λΌλŠ” 맀크둜λ₯Ό μ΄μš©ν•˜μ—¬ μ²˜λ¦¬ν•œλ‹€. math_errhandlingμ΄λΌλŠ” λ§€ν¬λ‘œλŠ” Bitmask κ°’μœΌλ‘œ MATH_ERRNO와 MATH_ERREXCEPTλ₯Ό μ‚¬μš©ν•œλ‹€. MATH_ERRNOλŠ” 1, MATH_ERREXCEPTλŠ” 2의 값을 가진닀. λ”°λΌμ„œ MATH_ERRNO | MATH_ERREXCEPTλŠ” 3μ΄λΌλŠ” 값이 λœλ‹€. math_errhandling을 μ΄μš©ν•œ μ˜ˆμ œλŠ” μ•„λž˜μ™€ κ°™λ‹€.
#include <stdio.h> // printf #include <math.h> // math_errhandling #include <fenv.h> // feclearexcept, fetestexcept, FE_ALL_EXCEPT, FE_INVALID int main(void) { if (math_errhandling & MATH_ERREXCEPT) feclearexcept(FE_ALL_EXCEPT); printf("Error Handling : %d\n", math_errhandling); printf("Domain Error Value : %f\n", sqrt(-10.0)); if (math_errhandling & MATH_ERREXCEPT) if (fetestexcept(FE_INVALID)) printf("FE_INVALID raised\n"); return (0); }
C
MATH_ERRNO에 λŒ€ν•΄μ„œλŠ” Domain Errorκ°€ λ°œμƒν•˜λ©΄ <errno.h>의 errno 값을 EDOM으둜 μ„€μ •ν•˜κ³ , Range Errorκ°€ λ°œμƒν•˜λ©΄ <errno.h>의 errno 값을 ERANGE둜 μ„€μ •ν•œλ‹€. (μ• μ΄ˆμ— λ²”μœ„μ— ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 값을 μ΄μš©ν•˜λŠ” κ²½μš°κ°€ Domain Error, λ²”μœ„μ— ν•΄λ‹Ήν•˜λŠ” 값을 μ΄μš©ν–ˆλŠ”λ° Pole Error, Overflow, Underflow등이 λ°œμƒν•œ κ²½μš°κ°€ Range Error라고 보면 λœλ‹€.)
MATH_ERREXCEPT에 λŒ€ν•΄μ„œλŠ” Domain Errorκ°€ λ°œμƒν•˜λ©΄ FE_INVALIDκ°€ λ°œμƒν•˜κ³ , Pole Errorκ°€ λ°œμƒν•˜λ©΄ FE_DIVBYZEROκ°€ λ°œμƒν•˜κ³ , Overflowκ°€ λ°œμƒν•˜λ©΄ FE_OVERFLOWκ°€ λ°œμƒν•˜κ³ , Underflowκ°€ λ°œμƒν•˜λ©΄ FE_UNDERFLOW κ°€ λ°œμƒν•œλ‹€.
<math.h>에 μ‘΄μž¬ν•˜λŠ” 각 ν•¨μˆ˜μ˜ Domainκ³Ό RangeλŠ” μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•˜μž.

1. Trigonometric Functions

1) cos

ν•¨μˆ˜ μ›ν˜•

float cosf(float x); double cos(double x); long double cosl(long double x);
C

ν•¨μˆ˜ 인자

ν•¨μˆ˜μ˜ 인자둜 Angle이 μ•„λ‹Œ Radian 값을 λ°›λŠ”λ‹€. λ”°λΌμ„œ 만일 Angle 값을 κ°–κ³  μžˆλ‹€λ©΄ Ο€180\frac {\pi} {180}λ₯Ό κ³±ν•˜μ—¬ Radian으둜 λ³€ν™˜ ν›„ 인자둜 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€. Ο€\piλŠ” 일반적으둜 #define을 μ΄μš©ν•˜μ—¬ 3.14159265κ°’μœΌλ‘œ 두고 μ“°λ©΄ λœλ‹€.

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•œ coscos 값을 λ°˜ν™˜

2) sin

ν•¨μˆ˜ μ›ν˜•

float sinf(float x); double sin(double x); long double sinl(long double x);
C

ν•¨μˆ˜ 인자

ν•¨μˆ˜μ˜ 인자둜 Angle이 μ•„λ‹Œ Radian 값을 λ°›λŠ”λ‹€. λ”°λΌμ„œ 만일 Angle 값을 κ°–κ³  μžˆλ‹€λ©΄ Ο€180\frac {\pi} {180}λ₯Ό κ³±ν•˜μ—¬ Radian으둜 λ³€ν™˜ ν›„ 인자둜 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€. Ο€\piλŠ” 일반적으둜 #define을 μ΄μš©ν•˜μ—¬ 3.14159265κ°’μœΌλ‘œ 두고 μ“°λ©΄ λœλ‹€.

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•œ sinsin 값을 λ°˜ν™˜

3) tan

ν•¨μˆ˜ μ›ν˜•

float tanf(float x); double tan(double x); long double tan(long double x);
C

ν•¨μˆ˜ 인자

ν•¨μˆ˜μ˜ 인자둜 Angle이 μ•„λ‹Œ Radian 값을 λ°›λŠ”λ‹€. λ”°λΌμ„œ 만일 Angle 값을 κ°–κ³  μžˆλ‹€λ©΄ Ο€180\frac {\pi} {180}λ₯Ό κ³±ν•˜μ—¬ Radian으둜 λ³€ν™˜ ν›„ 인자둜 λ„£μ–΄μ€˜μ•Ό ν•œλ‹€. Ο€\piλŠ” 일반적으둜 #define을 μ΄μš©ν•˜μ—¬ 3.14159265κ°’μœΌλ‘œ 두고 μ“°λ©΄ λœλ‹€.

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•œ tantan 값을 λ°˜ν™˜

4) acos

ν•¨μˆ˜ μ›ν˜•

float acosf(float x); double acos(double x); long double acosl(long double x);
C

ν•¨μˆ˜ 인자

[βˆ’1,+1][-1, +1]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian κ°’ (ꡬ간 μ™Έ 값이 λ“€μ–΄κ°€λ©΄ Domain이 λ§žμ§€ μ•ŠλŠ” κ²ƒμ΄λ―€λ‘œ Domain Errorκ°€ λ°œμƒν•œλ‹€.)

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•΄ arccosarccos을 μˆ˜ν–‰ν•˜μ—¬ [0,Ο€][0, \pi]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian 값을 λ°˜ν™˜ (Angle둜 μ΄μš©ν•˜λ €λ©΄ 180Ο€\frac{180}{\pi}을 κ³±ν•˜μ—¬ μ΄μš©ν•œλ‹€.)

5) asin

ν•¨μˆ˜ μ›ν˜•

float asinf(float x); double asin(double x); long double asinl(long double x);
C

ν•¨μˆ˜ 인자

[βˆ’1,+1][-1, +1]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian κ°’ (ꡬ간 μ™Έ 값이 λ“€μ–΄κ°€λ©΄ Domain이 λ§žμ§€ μ•ŠλŠ” κ²ƒμ΄λ―€λ‘œ Domain Errorκ°€ λ°œμƒν•œλ‹€.)

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•΄ arcsinarcsin을 μˆ˜ν–‰ν•˜μ—¬ [βˆ’Ο€2,+Ο€2][-\frac{\pi}{2}, +\frac{\pi}{2}]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian 값을 λ°˜ν™˜ (Angle둜 μ΄μš©ν•˜λ €λ©΄ 180Ο€\frac{180}{\pi}을 κ³±ν•˜μ—¬ μ΄μš©ν•œλ‹€.)

6) atan

ν•¨μˆ˜ μ›ν˜•

float atanf(float x); double atan(double x); long double atanl(long double x);
C

ν•¨μˆ˜ 인자

λ‹€λ₯Έ arcν•¨μˆ˜λ“€μ²˜λŸΌ Domain이 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€. μ–΄λ–€ μ‹€μˆ˜ 값도 인자둜 μ‚¬μš©λ  수 μžˆλ‹€. 인자둜 λ“€μ–΄κ°„ 값은 Radian 값이닀.

λ°˜ν™˜ κ°’

xλΌλŠ” Radian에 λŒ€ν•΄ arctanarctan을 μˆ˜ν–‰ν•˜μ—¬ [βˆ’Ο€2,+Ο€2][-\frac{\pi}{2}, +\frac{\pi}{2}]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian 값을 λ°˜ν™˜ (Angle둜 μ΄μš©ν•˜λ €λ©΄ 180Ο€\frac{180}{\pi}을 κ³±ν•˜μ—¬ μ΄μš©ν•œλ‹€.)

μ°Έκ³ 

λΆ€ν˜Έμ˜ λͺ¨ν˜Έμ„± λ•Œλ¬Έμ— atanμ΄λΌλŠ” ν•¨μˆ˜λŠ” tantan 값에 μ˜ν•΄ λ–¨μ–΄μ§€λŠ” 각이 μ–΄λŠ 사뢄면인지 λͺ…ν™•νžˆ ν•  수 μ—†λ‹€. λ”°λΌμ„œ λΆ€λΆ„μ μœΌλ‘œ 인자λ₯Ό λ°›λŠ” atan2 ν•¨μˆ˜λ₯Ό λŒ€μ•ˆμœΌλ‘œ μ΄μš©ν•œλ‹€.

7) atan2

ν•¨μˆ˜ μ›ν˜•

float atan2f(float y, float x); double atan2(double y, double x); long double atan2l(long double y, long double x);
C

ν•¨μˆ˜ 인자

yλŠ” λ‚˜νƒ€λ‚΄λ €λŠ” μ’Œν‘œμ˜ yyμΆ• μœ„μ˜ 값을 μ˜λ―Έν•˜κ³ , xλŠ” λ‚˜νƒ€λ‚΄λ €λŠ” μ’Œν‘œμ˜ xxμΆ• μœ„μ˜ 값을 μ˜λ―Έν•œλ‹€. (두 값이 λͺ¨λ‘ 0으둜 주어지면 Domain Errorκ°€ λ°œμƒν•œλ‹€.) yx\frac {y} {x}둜 κ³„μ‚°λ˜μ–΄ Radian κ°’μœΌλ‘œ μ΄μš©λœλ‹€.

λ°˜ν™˜ κ°’

yx\frac{y}{x}λΌλŠ” Radian에 λŒ€ν•΄ arctanarctan을 μˆ˜ν–‰ν•˜μ—¬ [βˆ’Ο€,+Ο€][-\pi, +\pi]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” Radian 값을 λ°˜ν™˜ (Angle둜 μ΄μš©ν•˜λ €λ©΄ 180Ο€\frac{180}{\pi}을 κ³±ν•˜μ—¬ μ΄μš©ν•œλ‹€.)

2. Hyperbolic Functions

1) cosh

ν•¨μˆ˜ μ›ν˜•

float coshf(float x); double cosh(double x); long double coshl(long double x);
C

ν•¨μˆ˜ 인자

μŒκ³‘κ°μ„ λ‚˜νƒ€λ‚΄λŠ” 값을 인자둜 ν•œλ‹€.

λ°˜ν™˜ κ°’

μŒκ³‘κ°μ— λŒ€ν•΄ 쌍곑 코사인을 μ μš©ν•œ 값을 λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

2) sinh

ν•¨μˆ˜ μ›ν˜•

float sinhf(float x); double sinh(double x); long double sinhl(long double x);
C

ν•¨μˆ˜ 인자

μŒκ³‘κ°μ„ λ‚˜νƒ€λ‚΄λŠ” 값을 인자둜 ν•œλ‹€.

λ°˜ν™˜ κ°’

μŒκ³‘κ°μ— λŒ€ν•΄ 쌍곑 사인을 μ μš©ν•œ 값을 λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

3) tanh

ν•¨μˆ˜ μ›ν˜•

float tanhf(float x); double tanh(double x); long double tanhl(long double x);
C

ν•¨μˆ˜ 인자

μŒκ³‘κ°μ„ λ‚˜νƒ€λ‚΄λŠ” 값을 인자둜 ν•œλ‹€.

λ°˜ν™˜ κ°’

μŒκ³‘κ°μ— λŒ€ν•΄ 쌍곑 νƒ„μ  νŠΈλ₯Ό μ μš©ν•œ 값을 λ°˜ν™˜

4) acosh

ν•¨μˆ˜ μ›ν˜•

float acoshf(float x); double acosh(double x); long double acoshl(long double x);
C

ν•¨μˆ˜ 인자

1보닀 μž‘μ€ κ°’λ§Œ μ•„λ‹ˆλ©΄ λœλ‹€. 1보닀 μž‘μ€ 값이 λ“€μ–΄κ°€λ©΄ Domain Errorκ°€ λ°œμƒν•œλ‹€.

λ°˜ν™˜ κ°’

[0,+INFINITY][0, +INFINITY]λ₯Ό κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” μŒμˆ˜κ°€ μ•„λ‹Œ 쌍곑 μ½”μ‚¬μΈμ˜ μ˜μ—­ 값을 Radian으둜 λ°˜ν™˜

5) asinh

ν•¨μˆ˜ μ›ν˜•

float asinhf(float x); double asinh(double x); long double asinhl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜ 값이든 인자둜 μ‚¬μš©ν•  수 μžˆλ‹€.

λ°˜ν™˜ κ°’

쌍곑 μ‚¬μΈμ˜ μ˜μ—­ 값을 Radian으둜 λ°˜ν™˜

6) atanh

ν•¨μˆ˜ μ›ν˜•

float atanhf(float x); double atanh(double x); long double atanhl(long double x);
C

ν•¨μˆ˜ 인자

[βˆ’1,+1][-1, +1]을 κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” 값을 인자둜 λ°›λŠ”λ‹€. μ΄μ™Έμ˜ 값이 λ“€μ–΄κ°€λ©΄ Domain Errorκ°€ λ°œμƒν•œλ‹€. λ˜ν•œ -1 ν˜Ήμ€ +1이 인자둜 λ“€μ–΄κ°€λŠ” κ²½μš°μ—” Pole Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.

λ°˜ν™˜ κ°’

쌍곑 νƒ„μ  νŠΈμ˜ μ˜μ—­ 값을 Radian으둜 λ°˜ν™˜

3. Exponential and Logarithmic Functions

1) exp

ν•¨μˆ˜ μ›ν˜•

float expf(float x); double exp(double x); long double expl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜ 값이든 인자둜 μ‚¬μš©ν•  수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 xλ₯Ό μ΄μš©ν•˜μ—¬ exe^x값을 κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

2) frexp

ν•¨μˆ˜ μ›ν˜•

float frexpf(float x, int *exp); double frexp(double x, int *exp); long double frexpl(long double x, int *exp);
C

ν•¨μˆ˜ 인자

xλŠ” ν•¨μˆ˜ μˆ˜ν–‰μ„ 톡해 뢄해될 값을 μ˜λ―Έν•˜κ³ , expλŠ” ν•¨μˆ˜ μˆ˜ν–‰μ„ 톡해 μ €μž₯될 22의 μ§€μˆ˜ 값이닀. λ°˜ν™˜ 값이 μžˆλŠ”λ°λ„ λ³„λ„λ‘œ expλ₯Ό ν¬μΈν„°λ‘œ λ„˜κΈ°λŠ” 것을 보아 주둜 닀루고 싢은 값이 2κ°œμž„μ„ μ•Œ 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

μ ˆλŒ€κ°’μ΄ [0.5,1)[0.5, 1)λ₯Ό κ΅¬κ°„μœΌλ‘œ ν•˜λŠ” 뢀동 μ†Œμˆ˜μ μ„ λ°˜ν™˜ (2의 μ§€μˆ˜λ‘œ expλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°˜ν™˜ 값을 κ³±ν•˜λ©΄ xκ°€ λœλ‹€.)

μ°Έκ³ 

λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©λ˜λŠ” 뢀동 μ†Œμˆ˜μ μ„ Significand라고 λΆ€λ₯Έλ‹€. frexp ν•¨μˆ˜λŠ” 인자둜 받은 κ°’ x을 Significand와 exp둜 λ‚˜λˆ„μ–΄ ν‘œν˜„ν•˜κ³ μž ν•œλ‹€. 즉, x=SignificandΓ—2expx = Significand \times 2^{exp} 이닀. 만일 x둜 0이 λ“€μ–΄μ˜€λ©΄ Significand와 expλŠ” λͺ¨λ‘ 0이 λœλ‹€. 만일 xκ°€ 음수둜 λ“€μ–΄μ˜€λ©΄, Significand도 음수둜 λ°˜ν™˜λœλ‹€.

3) ldexp

ν•¨μˆ˜ μ›ν˜•

float ldexpf(float x, int exp); double ldexp(double x, int exp); long double ldexpl(long double x, int exp);
C

ν•¨μˆ˜ 인자

xλŠ” ν•¨μˆ˜ μˆ˜ν–‰μ— μ‚¬μš©λ˜λŠ” Significand이고, expλŠ” ν•¨μˆ˜ μˆ˜ν–‰μ— μ‚¬μš©λ  2의 μ§€μˆ˜ 값이닀.

λ°˜ν™˜ κ°’

인자둜 받은 x와 expλ₯Ό μ΄μš©ν•˜μ—¬ xΓ—2expx \times 2^{exp}λ₯Ό κ³„μ‚°ν•œ κ²°κ³Όλ₯Ό λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

μ°Έκ³ 

frexp ν•¨μˆ˜κ°€ λΆ„ν•΄ν•˜λŠ” ν•¨μˆ˜μ˜€λ‹€λ©΄, ldexpλŠ” ν•©μ„±ν•˜λŠ” ν•¨μˆ˜λΌκ³  보면 λœλ‹€.

4) log

ν•¨μˆ˜ μ›ν˜•

float logf(float x); double log(double x); long double log(long double x);
C

ν•¨μˆ˜ 인자

인자 값이 음수라면 Domain Errorκ°€ λ°œμƒν•œλ‹€. μΈμžκ°€ 0일 λ•ŒλŠ” Implementation-Defined Behaviorμ—¬μ„œ Pole Errorκ°€ λ‚˜νƒ€λ‚  μˆ˜λ„ μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 xλ₯Ό 밑을 eeλ‘œν•˜λŠ” μžμ—° 둜그λ₯Ό μ·¨ν•˜μ—¬ λ°˜ν™˜

5) log10

ν•¨μˆ˜ μ›ν˜•

float log10f(float x); double log10(double x); long double log10l(long double x);
C

ν•¨μˆ˜ 인자

인자 값이 음수라면 Domain Errorκ°€ λ°œμƒν•œλ‹€. μΈμžκ°€ 0일 λ•ŒλŠ” Implementation-Defined Behaviorμ—¬μ„œ Pole Errorκ°€ λ‚˜νƒ€λ‚  μˆ˜λ„ μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 xλ₯Ό 밑을 1010으둜 ν•˜λŠ” 둜그λ₯Ό μ·¨ν•˜μ—¬ λ°˜ν™˜

6) modf

ν•¨μˆ˜ μ›ν˜•

float modff(float x, float *intpart); double modf(double x, double *intpart); long double modfl(long double x, long double *intpart);
C

ν•¨μˆ˜ 인자

μ •μˆ˜λΆ€μ™€ μ†Œμˆ˜λΆ€λ‘œ λ‚˜λˆ„κ³ μž ν•˜λŠ” κ°’ x와 λ‚˜λˆˆ μ •μˆ˜λΆ€λ₯Ό μ €μž₯ν•  intpartλΌλŠ” 포인터λ₯Ό 인자둜 λ°›λŠ”λ‹€. intpart의 νƒ€μž…μ€ x의 νƒ€μž…κ³Ό λ™μΌν•˜κ²Œ λ°›μœΌλ©°, λΆ€ν˜Έ μ—­μ‹œ x와 λ™μΌν•˜κ²Œ μ €μž₯λœλ‹€. (λ‚˜λˆ„κ³ μž ν•˜λŠ” κ°’ xκ°€ 음수면 intpartκ°€ 음수둜 μ €μž₯λœλ‹€.)

λ°˜ν™˜ κ°’

인자 x의 μ†Œμˆ˜λΆ€λ₯Ό λ°˜ν™˜ (μ†Œμˆ˜λΆ€μ˜ λΆ€ν˜Έ μ—­μ‹œ x와 λ™μΌν•˜λ‹€.)

μ°Έκ³ 

μ •μˆ˜λΆ€μ™€ μ†Œμˆ˜λΆ€μ˜ λΆ€ν˜Έ λͺ¨λ‘ x의 λΆ€ν˜Έμ™€ λ™μΌν•˜λ‹€. μ •μˆ˜λΆ€λ₯Ό μ €μž₯ν•˜λŠ” intpartκ°€ int νƒ€μž…μ„ 쓰지 μ•Šκ³  μ‹€μˆ˜ ν‘œν˜„μ„ μœ„ν•œ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것은 μ†Œμˆ˜λΆ€μ™€μ˜ μ—°μ‚° νŽΈμ˜μ„±κ³Ό κ·Έ μ˜λ„ λ•Œλ¬Έμ΄λ‹€.

7) exp2

ν•¨μˆ˜ μ›ν˜•

float exp2f(float x); double exp2(double x); long double exp2l(long double x);
C

ν•¨μˆ˜ 인자

μ§€μˆ˜μŠΉμœΌλ‘œ μ‚¬μš©λ  xλ₯Ό 인자둜 λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

인자 xλ₯Ό μ΄μš©ν•˜μ—¬ 22의 μ§€μˆ˜μŠΉμ„ λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

8) expm1

ν•¨μˆ˜ μ›ν˜•

float expm1f(float x); double expm1(double x); long double expm1l(long double x);
C

ν•¨μˆ˜ 인자

μ§€μˆ˜μŠΉμœΌλ‘œ μ‚¬μš©λ  xλ₯Ό 인자둜 λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

인자 xλ₯Ό μ΄μš©ν•˜μ—¬ ee의 μ§€μˆ˜μŠΉμ„ λ§Œλ“€κ³  1을 λΊ€ 값을 λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

μ°Έκ³ 

expm1 ν•¨μˆ˜μ˜ μ΄λ¦„μ—μ„œ m1은 Minus One을 μ˜λ―Έν•œλ‹€. 인자둜 받은 x의 값이 그리 크지 μ•Šμ€ 값이라면, exp ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ exp(x) - 1보닀 더 μ •ν™•ν•  수 μžˆμ–΄μ„œ 이λ₯Ό μ΄μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.

9) ilogb

ν•¨μˆ˜ μ›ν˜•

int ilogbf(float x); int ilogb(double x); int ilogbl(long double x);
C

ν•¨μˆ˜ 인자

ν•¨μˆ˜μ˜ μ˜λ„λŒ€λ‘œλΌλ©΄ μΈμžμ— μ ˆλŒ€κ°’μ„ μ΄μš©ν•˜μ—¬ 둜그λ₯Ό μ·¨ν•˜κΈ° λ•Œλ¬Έμ— μ–΄λ–€ 값이 듀어와도 λ¬΄λ°©ν•˜λ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x의 μ ˆλŒ€κ°’μ— 밑을 FLT_RADIXλ‘œν•˜λŠ” 둜그λ₯Ό μ·¨ν•΄ μ •μˆ˜λΆ€λ₯Ό λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€. λ˜ν•œ 인자둜 받은 값이 0, infinity, NaN이라면 Domain Error ν˜Ήμ€ Range Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.)

μ°Έκ³ 

인자둜 받은 x값이 0이면 FP_ILOGB0이 λ°˜ν™˜λœλ‹€. (FP_ILOGB0은 맀크둜 μƒμˆ˜λ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.)
인자둜 받은 값이 infinity이면 INT_MAXκ°€ λ°˜ν™˜λœλ‹€.
인자둜 받은 x값이 NaN이면 FP_ILOGBNAN이 λ°˜ν™˜λœλ‹€. (FP_ILOGBNAN은 맀크둜 μƒμˆ˜λ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.)
인자둜 받은 x값이 Normal이라면 FLT_RADIXλ₯Ό λ°‘μœΌλ‘œν•˜λŠ” 둜그λ₯Ό μ·¨ν•˜μ—¬ μ •μˆ˜λΆ€λ₯Ό λ°˜ν™˜ν•œλ‹€.
인자둜 받은 x값이 Subnormal이면 Normalize된 ν‘œν˜„ (음의 μ§€μˆ˜)의 값이 λ°˜ν™˜λœλ‹€.
isnormalμ΄λΌλŠ” 맀크둜 ν•¨μˆ˜κ°€ μžˆλŠ”λ° μ΄λŠ” 0, infinity, NaN, subnormal에 λŒ€ν•΄μ„œ 0을 λ°˜ν™˜ν•˜κ³  κ·Έ μ™Έμ˜ 값에 λŒ€ν•΄μ„  1을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μ—¬κΈ°μ„œμ˜ Normalκ³Ό Subnormal은 isnormal의 νŒλ³„μ„ λ”°λ₯Έλ‹€.
FLT_RADIXλŠ” 일반적으둜 2둜 μ •μ˜λ˜μ–΄ μžˆλ‹€.
λ‚΄λΆ€μ μœΌλ‘œ 인자둜 λ“€μ–΄μ˜¨ κ°’ xλ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•΄ SignificandSignificand와 expexpλ₯Ό μ΄μš©ν•œλ‹€. SignificandSignificandλŠ” 1.0μ—μ„œ FLT_RADIX μ‚¬μ΄μ˜ 값을 κ°–κ³  μžˆλŠ”λ°, μ ˆλŒ€κ°’μ„ μ·¨ν•œ μ–‘μˆ˜ xλ₯Ό ν‘œν˜„ν•  λ•Œ ∣x∣=significandΓ—FLT_RADIXexp|x| = significand \times FLT\_RADIX^{exp}와 같이 λ‚˜νƒ€λ‚œλ‹€.

10) log1p

ν•¨μˆ˜ μ›ν˜•

float log1pf(float x); double log1p(double x); long double log1pl(long double x);
C

ν•¨μˆ˜ 인자

-1보닀 μž‘μ€ 값이 λ“€μ–΄κ°€λ©΄ Domain Errorκ°€ λ°œμƒν•œλ‹€. μΈμžκ°€ -1일 λ•ŒλŠ” Implementation-Defined Behaviorμ—¬μ„œ Pole Errorκ°€ λ‚˜νƒ€λ‚  μˆ˜λ„ μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x 값에 1을 λ”ν•˜μ—¬ 밑을 ee둜 ν•˜λŠ” 둜그λ₯Ό μ·¨ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

log1p ν•¨μˆ˜μ˜ μ΄λ¦„μ—μ„œ 1pλŠ” Plus One을 μ˜λ―Έν•œλ‹€. 인자둜 받은 x의 값이 그리 크지 μ•Šμ€ 값이라면, log ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ log(1+p)보닀 더 μ •ν™•ν•  수 μžˆμ–΄μ„œ 이λ₯Ό μ΄μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.

11) log2

ν•¨μˆ˜ μ›ν˜•

float log2f(float x); double log2(double x); long double log2l(long double x);
C

ν•¨μˆ˜ 인자

μΈμžκ°€ 음수라면 Domain Errorκ°€ λ°œμƒν•œλ‹€. μΈμžκ°€ 0일 λ•ŒλŠ” Implementation-Defined Behaviorμ—¬μ„œ Pole Errorκ°€ λ‚˜νƒ€λ‚  μˆ˜λ„ μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x값을 μ΄μš©ν•˜μ—¬ 밑을 22λ‘œν•˜λŠ” 둜그λ₯Ό μ·¨ν•œ 값을 λ°˜ν™˜

12) logb

ν•¨μˆ˜ μ›ν˜•

float logbf(float x); double logb(double x); long double logbl(long double x);
C

ν•¨μˆ˜ 인자

μΈμžκ°€ 0일 λ•ŒλŠ” Domain Error ν˜Ήμ€ Pole Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x값에 μ ˆλŒ€κ°’μ„ μ·¨ν•˜μ—¬ 밑을 FLT_RADIXλ‘œν•˜λŠ” 둜그λ₯Ό μ·¨ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

인자둜 λ“€μ–΄μ˜¨ x값이 μ–‘μˆ˜λΌλ©΄ κ·Έ λ™μž‘μ΄ log ν•¨μˆ˜μ™€ λ™μΌν•˜λ‹€. (FLT_RADIXλŠ” 일반적으둜 λŒ€λΆ€λΆ„μ˜ ν”Œλž«νΌμ—μ„œ 2λΌλŠ” 값을 κ°–κΈ° λ•Œλ¬Έμ΄λ‹€.)

13) scalbn

ν•¨μˆ˜ μ›ν˜•

float scalbnf(float x, int n); double scalbn(double x, int n); long double scalbnl(long double x, int n);
C

ν•¨μˆ˜ 인자

xλŠ” Significandλ₯Ό μ˜λ―Έν•˜λŠ” μ‹€μˆ˜μ΄κ³ , n은 제곱 연산을 μˆ˜ν–‰ν•  exp에 ν•΄λ‹Ήν•œλ‹€.

λ°˜ν™˜ κ°’

FLT_RADIXλ₯Ό 인자둜 받은 n만큼 μ œκ³±ν•˜μ—¬ 인자둜 받은 xλ₯Ό κ³±ν•œ 값을 λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

μ°Έκ³ 

scalbn(x,n)=xΓ—FLT_RADIXnscalbn(x, n) = x \times FLT\_RADIX^{n}인데 일반적으둜 λŒ€λΆ€λΆ„μ˜ ν”Œλž«νΌμ—μ„œ FLT_RADIXλŠ” 2λΌλŠ” 값을 κ°–κΈ° 떄문에 scalbnμ΄λΌλŠ” ν•¨μˆ˜λŠ” ldexp ν•¨μˆ˜μ™€ κ·Έ κΈ°λŠ₯이 λ™μΌν•˜λ‹€.

14) scalbln

ν•¨μˆ˜ μ›ν˜•

float scalblnf(float x, long int n); double scalbln(double x, long int n); long double scalblnl(long double x, long int n);
C

ν•¨μˆ˜ 인자

xλŠ” Significandλ₯Ό μ˜λ―Έν•˜λŠ” μ‹€μˆ˜μ΄κ³ , n은 제곱 연산을 μˆ˜ν–‰ν•  exp에 ν•΄λ‹Ήν•œλ‹€.

λ°˜ν™˜ κ°’

FLT_RADIXλ₯Ό 인자둜 받은 n만큼 μ œκ³±ν•˜μ—¬ 인자둜 받은 xλ₯Ό κ³±ν•œ 값을 λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

μ°Έκ³ 

scalbln(x,n)=xΓ—FLT_RADIXnscalbln(x, n) = x \times FLT\_RADIX^{n}이닀. scalbln ν•¨μˆ˜λŠ” scalbn ν•¨μˆ˜μ™€ 달리 exp에 λŒ€ν•œ 인자 n을 long int둜 λ°›λŠ”λ‹€.

4. Power Functions

1) pow

ν•¨μˆ˜ μ›ν˜•

float powf(float base, float exponent); double pow(double base, double exponent); long double powl(long double base, long double exponent);
C

ν•¨μˆ˜ 인자

μΈμžλŠ” 이름 κ·ΈλŒ€λ‘œ baseκ°€ μ§€μˆ˜μ˜ λ°‘μœΌλ‘œ, exponentκ°€ μ§€μˆ˜μ˜ μŠΉμ„ μ˜λ―Έν•œλ‹€.

λ°˜ν™˜ κ°’

baseexponentbase^{exponent}λ₯Ό λ°˜ν™˜

μ°Έκ³ 

baseκ°€ Finite인데 음수이고 exponentκ°€ Finite인데 μ •μˆ˜κ°€ μ•„λ‹ˆλΌλ©΄, Domain Errorκ°€ λ°œμƒν•œλ‹€.
base와 exponentκ°€ λͺ¨λ‘ 0이라면 Implementation에 따라 λͺ‡ κ²½μš°μ—λŠ” Domain Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.
baseκ°€ 0이고 exponentκ°€ 음수면, Domain Error ν˜Ήμ€ Pole Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.
ν•¨μˆ˜ μˆ˜ν–‰μ˜ κ²°κ³Όκ°€ λ„ˆλ¬΄ ν¬κ±°λ‚˜ μž‘μœΌλ©΄ Range Errorκ°€ λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
isfiniteμ΄λΌλŠ” 맀크둜 ν•¨μˆ˜κ°€ μžˆλŠ”λ°, μ΄λŠ” 주어진 μˆ˜κ°€ finite이면 1을 λ°˜ν™˜ν•˜κ³  finiteν•˜μ§€ μ•Šλ‹€λ©΄ 0을 λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μ—¬κΈ°μ„œμ˜ Finite은 isfinite의 νŒλ³„μ„ λ”°λ₯Έλ‹€.

2) sqrt

ν•¨μˆ˜ μ›ν˜•

float sqrtf(float x); double sqrt(double x); long double sqrtl(long double x);
C

ν•¨μˆ˜ 인자

μΈμžκ°€ 음수라면 Domain Errorκ°€ λ°œμƒν•œλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x의 μ œκ³±κ·Όμ„ λ°˜ν™˜

3) cbrt

ν•¨μˆ˜ μ›ν˜•

float cbrtf(float x); double cbrt(double x); long double cbrtl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•œ μ„Έμ œκ³±κ·Όμ„ λ°˜ν™˜

4) hypot

ν•¨μˆ˜ μ›ν˜•

float hypotf(float x, float y); double hypot(double x, double y); long double hypotl(long double x, long double y);
C

ν•¨μˆ˜ 인자

직각 μ‚Όκ°ν˜•μ„ 이루고 μžˆλŠ” λ³€λ“€ 쀑 빗변을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 두 λ³€ x, yλ₯Ό 인자둜 λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x, y값에 λŒ€ν•΄ x2+y2\sqrt{x^2 + y^2}λ₯Ό κ³„μ‚°ν•˜μ—¬ λΉ—λ³€μ˜ 길이λ₯Ό λ°˜ν™˜ (λ°˜ν™˜ 값이 λ„ˆλ¬΄ μ»€μ„œ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν‘œν˜„μ΄ λΆˆκ°€λŠ₯ν•œ κ²½μš°μ—λŠ” λΆ€ν˜Έ 값이 뢙은 HUGE_VAL ν˜Ήμ€ HUGE_VALF ν˜Ήμ€ HUGE_VALL을 λ°˜ν™˜ν•˜κ³  Range Errorκ°€ λ°œμƒν•œλ‹€.)

5. Error and Gamma Functions

1) erf

ν•¨μˆ˜ μ›ν˜•

float erff(float x); double erf(double x); long double erfl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

Error Function을 μ²˜λ¦¬ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

Error Function의 μˆ˜μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.
erf(x)=2Ο€βˆ«0xeβˆ’t2dterf(x) = \frac{2}{\sqrt{\pi}}\intop^x_0e^{-t^2}dt

2) erfc

ν•¨μˆ˜ μ›ν˜•

float erfcf(float x); double erfc(double x); long double erfcl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆμ§€λ§Œ λ„ˆλ¬΄ 큰 값을 인자둜 λ°›κ²Œ 되면 Underflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•œλ‹€.

λ°˜ν™˜ κ°’

Complementary Error Function을 μ²˜λ¦¬ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

Complementary Error Function의 μˆ˜μ‹μ€ λ‹€μŒκ³Ό κ°™λ‹€.
erfc(x)=1βˆ’erf(x)erfc(x) = 1 - erf(x)
erfc(x)=1βˆ’2Ο€βˆ«0xeβˆ’t2dterfc(x) = 1- \frac{2}{\sqrt{\pi}}\intop^x_0e^{-t^2}dt

3) tgamma

ν•¨μˆ˜ μ›ν˜•

float tgammaf(float x); double tgamma(double x); long double tgammal(long double x);
C

ν•¨μˆ˜ 인자

인자둜 받은 값이 0 ν˜Ήμ€ 음의 μ •μˆ˜λΌλ©΄ ν•¨μˆ˜κ°€ 점근성을 띄기 λ•Œλ¬Έμ— Domain Error ν˜Ήμ€ Pole Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ˜ν•œ 인자둜 받은 값이 λ„ˆλ¬΄ 크닀면 Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•  수 있고, 인자둜 받은 값이 λ„ˆλ¬΄ μž‘λ‹€λ©΄ Underflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.

λ°˜ν™˜ κ°’

Gamma Function을 μ²˜λ¦¬ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

Gamma Function의 μˆ˜μ‹μ€ λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•œλ‹€.
tgamma(x)=Ξ“(x)tgamma(x) = \Gamma(x)

4) lgamma

ν•¨μˆ˜ μ›ν˜•

float lgammaf(float x); double lgamma(double x); long double lgammal(long double x);
C

ν•¨μˆ˜ 인자

인자둜 받은 값이 0 ν˜Ήμ€ 음의 μ •μˆ˜λΌλ©΄ ν•¨μˆ˜κ°€ 점근성을 띄기 λ•Œλ¬Έμ— Domain Error ν˜Ήμ€ Pole Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ˜ν•œ 인자둜 받은 값이 λ„ˆλ¬΄ 크닀면 Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.

λ°˜ν™˜ κ°’

Log Gamma Function을 μ²˜λ¦¬ν•œ 값을 λ°˜ν™˜

μ°Έκ³ 

Log Gamma Function의 μˆ˜μ‹μ€ λ‹€μŒκ³Ό 같이 ν‘œκΈ°ν•œλ‹€.
lgamma(x)=logeβˆ£Ξ“(x)∣lgamma(x) = log_e|\Gamma(x)|

6. Rounding and Remainder Functions

1) ceil

ν•¨μˆ˜ μ›ν˜•

float ceilf(float x); double ceil(double x); long double ceill(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x보닀 μž‘μ§€ μ•Šμ€ μ •μˆ˜ 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

μ˜¬λ¦Όμ„ μˆ˜ν–‰ν•œλ‹€.

2) floor

ν•¨μˆ˜ μ›ν˜•

float floorf(float x); double floor(double x); long double floorl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x보닀 크지 μ•Šμ€ μ •μˆ˜ 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

내림을 μˆ˜ν–‰ν•œλ‹€.

3) fmod

ν•¨μˆ˜ μ›ν˜•

float fmodf(float numer, float denom); double fmod(double numer, double denom); long double fmodl(long double numer, long double denom);
C

ν•¨μˆ˜ 인자

두 수의 λ‚˜λˆ—μ…ˆμ—μ„œ λΆ„λͺ¨ (Numerator)λ₯Ό μ˜λ―Έν•˜λŠ” numer, λΆ„μž (Denominator)λ₯Ό μ˜λ―Έν•˜λŠ” denom을 인자둜 λ°›λŠ”λ‹€. (denom의 값이 0이면, Implementation에 따라 0을 λ°˜ν™˜ν•˜κ±°λ‚˜ Domain Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.)

λ°˜ν™˜ κ°’

numerdenom\frac{numer}{denom}의 λ‚˜λ¨Έμ§€λ₯Ό 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

fmod ν•¨μˆ˜μ˜ μ—°μ‚° κ²°κ³ΌλŠ” numerβˆ’tquotΓ—denomnumer - tquot \times denom이닀. 이 λ•Œμ˜ tquottquot은 numerdenom\frac{numer}{denom}의 λͺ«μΈλ°, 이 λͺ«μ€ trunc된 값이닀. fmod와 λΉ„μŠ·ν•œ ν•¨μˆ˜λ‘œλŠ” remainderλΌλŠ” ν•¨μˆ˜κ°€ μžˆλŠ”λ°, remainderλŠ” λͺ«μ— λŒ€ν•΄μ„œ truncλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  roundλœλ‹€. truncλŠ” 버림을 roundλŠ” λ°˜μ˜¬λ¦Όμ„ μ˜λ―Έν•œλ‹€.

4) trunc

ν•¨μˆ˜ μ›ν˜•

float truncf(float x); double trunc(double x); long double truncl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 xλ₯Ό 크기둜 λ³΄μ•˜μ„ λ•Œ, κ·Έ 값보닀보닀 크지 μ•Šμ€ μ •μˆ˜ 값을 뢀동 μ†Œμˆ˜μ μ„ λ°˜ν™˜ (λΆ€ν˜ΈλŠ” λ™μΌν•˜κ²Œ μœ μ§€ν•œλ‹€.)

μ°Έκ³ 

버림을 μˆ˜ν–‰ν•œλ‹€.

5) round

ν•¨μˆ˜ μ›ν˜•

float roundf(float x); double round(double x); long double roundl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

6) lround

ν•¨μˆ˜ μ›ν˜•

long int lroundf(float x); long int lround(double x); long int lroundl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 long int둜 castingν•˜μ—¬ λ°˜ν™˜

μ°Έκ³ 

λ°˜μ˜¬λ¦Όν•œ 값이 λ°˜ν™˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ„˜λŠ” 경우, λ°˜ν™˜ 값은 Unspecified Behavior이고 Domain Error ν˜Ήμ€ Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ°˜ν™˜ νƒ€μž…μ΄ long int이닀.

7) llround

ν•¨μˆ˜ μ›ν˜•

long long int llroundf(float x); long long int llround(double x); long long int llroundl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 long long int둜 castingν•˜μ—¬ λ°˜ν™˜

μ°Έκ³ 

λ°˜μ˜¬λ¦Όν•œ 값이 λ°˜ν™˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ„˜λŠ” 경우, λ°˜ν™˜ 값은 Unspecified Behavior이고 Domain Error ν˜Ήμ€ Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ°˜ν™˜ νƒ€μž…μ΄ long long int이닀.

8) rint

ν•¨μˆ˜ μ›ν˜•

float rintf(float x); double rint(double x); long double rintl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

Implementation에 따라 λ°˜ν™˜ 값이 인자 x와 λ‹€λ₯Έ 경우 FE_INEXACTλΌλŠ” exception이 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
반올림 방식은 ν˜„μž¬ μ„€μ •λœ Rounding Direction Modeλ₯Ό λ”°λ₯Έλ‹€.

9) lrint

ν•¨μˆ˜ μ›ν˜•

long int lrintf(float x); long int lrint(double x); long int lrintl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 long int둜 castingν•˜μ—¬ λ°˜ν™˜

μ°Έκ³ 

Implementation에 따라 λ°˜ν™˜ 값이 인자 x와 λ‹€λ₯Έ 경우 FE_INEXACTλΌλŠ” exception이 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
반올림 방식은 ν˜„μž¬ μ„€μ •λœ Rounding Direction Modeλ₯Ό λ”°λ₯Έλ‹€.
λ°˜μ˜¬λ¦Όν•œ 값이 λ°˜ν™˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ„˜λŠ” 경우, λ°˜ν™˜ 값은 Unspecified Behavior이고 Domain Error ν˜Ήμ€ Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ°˜ν™˜ νƒ€μž…μ΄ long int이닀.

10) llrint

ν•¨μˆ˜ μ›ν˜•

long long int llrintf(float x); long long int llrint(double x); long long int llrintl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 long long int둜 castingν•˜μ—¬ λ°˜ν™˜

μ°Έκ³ 

Implementation에 따라 λ°˜ν™˜ 값이 인자 x와 λ‹€λ₯Έ 경우 FE_INEXACTλΌλŠ” exception이 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
반올림 방식은 ν˜„μž¬ μ„€μ •λœ Rounding Direction Modeλ₯Ό λ”°λ₯Έλ‹€.
λ°˜μ˜¬λ¦Όν•œ 값이 λ°˜ν™˜ νƒ€μž…μ˜ λ²”μœ„λ₯Ό λ„˜λŠ” 경우, λ°˜ν™˜ 값은 Unspecified Behavior이고 Domain Error ν˜Ήμ€ Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•˜κ±°λ‚˜Implementation에 따라 Errorκ°€ λ°œμƒν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ°˜ν™˜ νƒ€μž…μ΄ long int이닀.

11) nearbyint

ν•¨μˆ˜ μ›ν˜•

float nearbyintf(float x); double nearbyint(double x); long double nearbyintl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x에 λŒ€ν•΄ λ°˜μ˜¬λ¦Όν•œ 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

nearbyint ν•¨μˆ˜λŠ” rint와 달리, 인자둜 받은 값이 λ°˜ν™˜ κ°’κ³Ό λ‹€λ₯΄λ‹€κ³  ν•΄μ„œ FE_INEXACTλΌλŠ” exception을 λ°œμƒμ‹œν‚€μ§„ μ•ŠλŠ”λ‹€.
rint와 λ§ˆμ°¬κ°€μ§€λ‘œ 반올림 방식은 ν˜„μž¬ μ„€μ •λœ Rounding Direction Modeλ₯Ό λ”°λ₯Έλ‹€.

12) remainder

ν•¨μˆ˜ μ›ν˜•

float remainderf(float numer, float denom); double remainder(double numer, double denom); long double remainderl(long double numer, long double denom);
C

ν•¨μˆ˜ 인자

두 수의 λ‚˜λˆ—μ…ˆμ—μ„œ λΆ„λͺ¨ (Numerator)λ₯Ό μ˜λ―Έν•˜λŠ” numer, λΆ„μž (Denominator)λ₯Ό μ˜λ―Έν•˜λŠ” denom을 인자둜 λ°›λŠ”λ‹€. (denom의 값이 0이면, Implementation에 따라 0을 λ°˜ν™˜ν•˜κ±°λ‚˜ Domain Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.)

λ°˜ν™˜ κ°’

numerdenom\frac{numer}{denom}의 λ‚˜λ¨Έμ§€λ₯Ό 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

remainder ν•¨μˆ˜μ˜ μ—°μ‚° κ²°κ³ΌλŠ” numerβˆ’rquotΓ—denomnumer - rquot \times denom이닀. 이 λ•Œμ˜ rquotrquot은 numerdenom\frac{numer}{denom}의 λͺ«μΈλ°, 이 λͺ«μ€ round된 값이닀. remainder와 λΉ„μŠ·ν•œ ν•¨μˆ˜λ‘œλŠ” fmodλΌλŠ” ν•¨μˆ˜κ°€ μžˆλŠ”λ°, fmodλŠ” λͺ«μ— λŒ€ν•΄μ„œ roundλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³ , truncν•œλ‹€. roundλŠ” λ°˜μ˜¬λ¦Όμ„ truncλŠ” 버림을 μ˜λ―Έν•œλ‹€.

13) remquo

ν•¨μˆ˜ μ›ν˜•

float remquof(float numer, float denom, int *quot); double remquo(double numer, double denom, int *quot); long double remquol(long double numer, long double denom, int *quot);
C

ν•¨μˆ˜ 인자

두 수의 λ‚˜λˆ—μ…ˆμ—μ„œ λΆ„λͺ¨ (Numerator)λ₯Ό μ˜λ―Έν•˜λŠ” numer, λΆ„μž (Denominator)λ₯Ό μ˜λ―Έν•˜λŠ” denom을 인자둜 λ°›λŠ”λ‹€. μΆ”κ°€μ μœΌλ‘œ λͺ«μ„ μ €μž₯ν•  quotλΌλŠ” 인자λ₯Ό ν¬μΈν„°λ‘œ λ°›λŠ”λ‹€. (denom의 값이 0이면, Implementation에 따라 0을 λ°˜ν™˜ν•˜κ±°λ‚˜ Domain Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.)

λ°˜ν™˜ κ°’

numerdenom\frac{numer}{denom}의 λ‚˜λ¨Έμ§€λ₯Ό 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ°˜ν™˜

μ°Έκ³ 

λͺ«κ³Ό λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ” 방식이 remainder ν•¨μˆ˜μ˜ 방식과 λ™μΌν•˜λ‹€. 즉, truncκ°€ μ•„λ‹Œ roundλ₯Ό μ‚¬μš©ν•œλ‹€.
round vs rint vs nearbyint 그리고 Rounding Direction Mode round, rint, nearbyintλŠ” λͺ¨λ‘ λ°˜μ˜¬λ¦Όμ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. μš°μ„  rint와 nearbyint의 μ°¨μ΄λŠ” λ°˜ν™˜ κ°’κ³Ό 인자둜 μ‚¬μš©λœ 값이 μ„œλ‘œ λ‹€λ₯Ό λ•Œ FE_INEXACTλΌλŠ” exception을 내냐 μ•ˆ λ‚΄λƒμ˜ 차이만 μžˆμ„ 뿐, 반올림 μˆ˜ν–‰μ˜ κ²½μš°μ—λŠ” ν˜„μž¬ μ„€μ •λœ Rounding Direction Modeλ₯Ό λ”°λ₯Έλ‹€. ν•˜μ§€λ§Œ round ν•¨μˆ˜λŠ” Rounding Direction Modeλ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ•„ κ³ μ •λœ λ°©μ‹μœΌλ‘œ μš°λ¦¬κ°€ μ•Œκ³  μžˆλŠ” λ°©μ‹μ˜ λ°˜μ˜¬λ¦Όλ§Œμ„ μˆ˜ν–‰ν•œλ‹€. rint와 nearbyint ν•¨μˆ˜κ°€ μˆ˜ν–‰ν•  반올림 λ°©μ‹μ—λŠ” μ–΄λ–€ 것듀이 μžˆμ„κΉŒ? μ΄λŠ” <fenv.h>λ₯Ό 찾아보면 맀크둜둜 μ •μ˜λ˜μ–΄ μžˆλ‹€. ν˜„μž¬ μ„€μ •λ˜μ–΄ μžˆλŠ” Rounding Direction Modeλ₯Ό μ•Œμ•„λ‚΄λŠ” 방법은 <fenv.h>에 μžˆλŠ” fegetroundλΌλŠ” ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λŠ” 것이고, Rounding Direction Modeλ₯Ό μ„€μ •ν•˜λŠ” 방법은 <fenv.h>에 μžˆλŠ” fesetroundλΌλŠ” ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€. Implementation에 따라 λ‹€λ₯΄κΈ΄ ν•˜μ§€λ§Œ Default ModeλŠ” FE_TONEAREST이닀. FE_TONEAREST - Round to Neareast (0x0000) FE_DOWNWARD - Round Downward (0x0400) FE_UPWARD - Round Upward (0x0800) FE_TOWARDZERO - Round toward Zero (0x0c00)

7. Floating-Point Manipulation Functions

1) copysign

ν•¨μˆ˜ μ›ν˜•

float copysignf(float x, float y); double copysign(double x, double y); long double copysignl(long double x, long double y);
C

ν•¨μˆ˜ 인자

xλŠ” λ”°μ˜¨ λΆ€ν˜Έ 값을 μ μš©ν•˜μ—¬ 결과둜 λ‚Ό 인자이고, yλŠ” λΆ€ν˜Έ 값을 λ”°μ˜¬ μΈμžμ΄λ‹€.

λ°˜ν™˜ κ°’

y의 λΆ€ν˜Έλ₯Ό x에 μ μš©ν•˜μ—¬ λ°˜ν™˜

2) nan

ν•¨μˆ˜ μ›ν˜•

float nanf(const char *tagp); double nan(const char *tagp); long double nanl(const char *tagp);
C

ν•¨μˆ˜ 인자

Implementation-Defined인 C-string을 인자둜 λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

double νƒ€μž…μœΌλ‘œ 된 Quite NaN 값을 λ°˜ν™˜

μ°Έκ³ 

NaN이라고 ν•˜λŠ” 것은 00\frac{0}{0}μ΄λ‚˜ 음수의 제곱근과 같이 Undefined ν˜Ήμ€ ν‘œν˜„ν•  수 μ—†λŠ” 값을 뢀동 μ†Œμˆ˜μ μœΌλ‘œ λ‚˜νƒ€λ‚Έ 것이닀.
만일 nan ν•¨μˆ˜μ— 인자둜 주어진 C-string이 ""와 같이 널 λ¬Έμžμ—΄ (빈 λ¬Έμžμ—΄)일 경우, 일반적인 NaN 값을 λ°˜ν™˜ν•œλ‹€. (이 κ²°κ³ΌλŠ” strtod ν•¨μˆ˜μ— "NaN"μ΄λΌλŠ” C-string 인자λ₯Ό μ€€ 것과 같은 결과이닀.) 인자둜 μ‚¬μš©λ˜λŠ” C-string은 라이브러리 κ΅¬ν˜„μ— 따라 νŠΉμ • λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λœ λ‹€λ₯Έ NaN 값을 κ΅¬λ³„ν•˜λŠ”λ° μ‚¬μš©λ  수 μžˆλ‹€. nan ν•¨μˆ˜μ˜ κ²½μš°μ—λŠ” Quiet NaN을 닀룬닀. λ‹€λ₯Έ NaNμœΌλ‘œλŠ” Signaling NaN이 μžˆλ‹€.
Quiet NaN이라함은 ν”„λ‘œκ·Έλž¨μ΄ NaN을 직접 λ§Œλ‚˜κΈ° μ „κΉŒμ§€ λ³„λ„λ‘œ μ΄μƒν•˜λ‹€κ³  μ§€μ‹œλ₯Ό ν•˜μ§€ μ•ŠλŠ” NaN이라고 보면 λœλ‹€. 뢀동 μ†Œμˆ˜μ μ„ μ²˜λ¦¬ν•˜λŠ” FPU (Floating Point Unit)μœΌλ‘œλΆ€ν„° λ³„λ„μ˜ μ‹ ν˜Έλ₯Ό 받은 것이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ»΄ν“¨νŒ… 연산이 μ§€μ†λœλ‹€. λ°˜λ©΄μ— Signaling NaN의 κ²½μš°μ—λŠ” FPUλ‘œλΆ€ν„° exception ν˜•νƒœλ‘œ μ‹ ν˜Έλ₯Ό λ³΄λ‚΄κ²Œ λœλ‹€. 각 qNaNκ³Ό sNaN의 ν™œμš©μ€ μ‚¬μš©μ— 따라 λ‹€λ₯΄κ² μ§€λ§Œ κ°„λ‹¨ν•œ μ˜ˆμ‹œλŠ” μ•„λž˜ λ§ν¬μ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλ‹€.

3) nextafter

ν•¨μˆ˜ μ›ν˜•

float nextafterf(float x, float y); double nextafter(double x, double y); long double nextafterl(long double x, long double y);
C

ν•¨μˆ˜ 인자

κΈ°μ€€ 값을 μ˜λ―Έν•˜λŠ” x, 근사값 μ‚°μΆœμ„ μœ„ν•œ λ°©ν–₯이 yλ₯Ό μ˜λ―Έν•œλ‹€.

λ°˜ν™˜ κ°’

x>yx>y일 λ•ŒλŠ” μ‹€μˆ˜λ‘œ ν‘œν˜„ν•  수 μžˆλŠ” 수 μ€‘μ—μ„œ ν˜„μž¬ xx보닀 λ°”λ‘œ μž‘μ€ μ‹€μˆ˜, x<yx < y일 λ•ŒλŠ” μ‹€μˆ˜λ‘œ ν‘œν˜„ν•  수 μžˆλŠ” 수 쀑에 ν˜„μž¬ xx보닀 λ°”λ‘œ 큰 μ‹€μˆ˜, x=yx=y일 λ•ŒλŠ” yyλ₯Ό λ°˜ν™˜

μ°Έκ³ 

nextafter와 λ™μΌν•œ κΈ°λŠ₯을 ν•˜μ§€λ§Œ, y인자λ₯Ό long double둜만 λ°›λŠ” nexttowardλΌλŠ” ν•¨μˆ˜λ„ μžˆλ‹€. ν‘œν˜„ν•  수 μžˆλŠ” μΆ©λΆ„νžˆ 큰 Finiteν•œ 값이 x일 λ•Œ, λ°˜ν™˜ 값은 Infiniteμ΄κ±°λ‚˜ ν‘œν˜„ν•  수 없을 μˆ˜λ„ μžˆλ‹€. 이에 따라 Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.

4) nexttoward

ν•¨μˆ˜ μ›ν˜•

float nexttowardf(float x, long double y); double nexttoward(double x, long double y); long double nexttowardl(long double x, long double y);
C

ν•¨μˆ˜ 인자

κΈ°μ€€ 값을 μ˜λ―Έν•˜λŠ” x, 근사값 μ‚°μΆœμ„ μœ„ν•œ λ°©ν–₯이 yλ₯Ό μ˜λ―Έν•œλ‹€.

λ°˜ν™˜ κ°’

x>yx>y일 λ•ŒλŠ” μ‹€μˆ˜λ‘œ ν‘œν˜„ν•  수 μžˆλŠ” 수 μ€‘μ—μ„œ ν˜„μž¬ xx보닀 λ°”λ‘œ μž‘μ€ μ‹€μˆ˜, x<yx < y일 λ•ŒλŠ” μ‹€μˆ˜λ‘œ ν‘œν˜„ν•  수 μžˆλŠ” 수 쀑에 ν˜„μž¬ xx보닀 λ°”λ‘œ 큰 μ‹€μˆ˜, x=yx=y일 λ•ŒλŠ” yyλ₯Ό λ°˜ν™˜

μ°Έκ³ 

ν‘œν˜„ν•  수 μžˆλŠ” μΆ©λΆ„νžˆ 큰 Finiteν•œ 값이 x일 λ•Œ, λ°˜ν™˜ 값은 Infiniteμ΄κ±°λ‚˜ ν‘œν˜„ν•  수 없을 μˆ˜λ„ μžˆλ‹€. 이에 따라 Overflow둜 μΈν•œ Range Errorκ°€ λ°œμƒν•  수 μžˆλ‹€.

8. Minimum, Maximum, Difference Functions

1) fdim

ν•¨μˆ˜ μ›ν˜•

float fdimf(float x, float y); double fdim(double x, double y); long double fdiml(long double x, long double y);
C

ν•¨μˆ˜ 인자

차이 κ°’ 계산을 μœ„ν•œ 두 인자 x, yλ₯Ό λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

x>yx>y라면 xβˆ’yx-yλ₯Ό λ°˜ν™˜, x≀yx≀y라면 0을 λ°˜ν™˜ (즉, xx와 yy의 차이λ₯Ό μŒμˆ˜κ°€ μ•„λ‹Œ 수둜 λ°˜ν™˜)

2) fmax

ν•¨μˆ˜ μ›ν˜•

float fmaxf(float x, float y); double fmax(double x, double y); long double fmaxl(long double x, long double y);
C

ν•¨μˆ˜ 인자

비ꡐ할 두 인자 x, yλ₯Ό λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

두 인자 x, y 쀑 더 큰 인자λ₯Ό λ°˜ν™˜

μ°Έκ³ 

ν•œ μΈμžκ°€ NaN이라면, λ‚˜λ¨Έμ§€ 인자λ₯Ό λ°˜ν™˜ν•œλ‹€.

3) fmin

ν•¨μˆ˜ μ›ν˜•

float fminf(float x, float y); double fmin(double x, double y); long double fminl(long double x, long double y);
C

ν•¨μˆ˜ 인자

비ꡐ할 두 인자 x, yλ₯Ό λ°›λŠ”λ‹€.

λ°˜ν™˜ κ°’

두 인자 x, y 쀑 더 μž‘μ€ 인자λ₯Ό λ°˜ν™˜

μ°Έκ³ 

ν•œ μΈμžκ°€ NaN이라면, λ‚˜λ¨Έμ§€ 인자λ₯Ό λ°˜ν™˜ν•œλ‹€.

9. Other Functions

1) fabs

ν•¨μˆ˜ μ›ν˜•

float fabsf(float x); double fabs(double x); long double fabsl(long double x);
C

ν•¨μˆ˜ 인자

μ–΄λ–€ μ‹€μˆ˜λ„ μΈμžκ°€ 될 수 μžˆλ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x의 μ ˆλŒ€κ°’μ„ λ°˜ν™˜

2) abs

absλŠ” <math.h>에 μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€. 적어도 C μ–Έμ–΄μ—μ„œλŠ” κ·Έλ ‡λ‹€. C μ–Έμ–΄μ—μ„œμ˜ abs ν•¨μˆ˜λŠ” <stdlib.h>에 μ‘΄μž¬ν•˜λ©°, int νƒ€μž…μ˜ 인자λ₯Ό λ°›μ•„ int νƒ€μž…μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€. absλΌλŠ” ν•¨μˆ˜κ°€ <math.h>의 ν•¨μˆ˜κ°€ μ•„λ‹˜μ—λ„ ν—·κ°ˆλ¦¬λŠ” μ΄μœ λŠ” κ·Έ μš©λ„κ°€ 라이브러리 μ΄λ¦„κ³Όμ˜ 관련성이 크기 λ•Œλ¬Έμ΄κ³ , C++μ—μ„œ <cmath>λ‘œλΆ€ν„° abs에 λŒ€ν•œ λ‹€μ–‘ν•œ μ˜€λ²„λ‘œλ”© ν•¨μˆ˜λ₯Ό μ œκ³΅λ°›κΈ° λ•Œλ¬Έμ΄λ‹€. C μ–Έμ–΄μ—μ„œ abs ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜κ³  μ‹Άλ‹€λ©΄ μœ„μ—μ„œ μ œμ‹œλœ fabs ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€.

3) fma

ν•¨μˆ˜ μ›ν˜•

float fmaf(float x, float y, float z); double fma(double x, double y, double z); long double fmal(long double x, long double y, long double z);
C

ν•¨μˆ˜ 인자

x, yλŠ” 곱에 μ‚¬μš©λ  인자이고, zλŠ” λ§μ…ˆμ— μ‚¬μš©λ  μΈμžμ΄λ‹€.

λ°˜ν™˜ κ°’

인자둜 받은 x, y, z에 λŒ€ν•΄ xΓ—y+zx \times y + z 값을 λ°˜ν™˜

μ°Έκ³ 

μ•„λž˜μ— 주어진 맀크둜 μƒμˆ˜λ“€μ€ Implementation-Defined Behavior이닀. xΓ—y+zx \times y + z에 λŒ€ν•œ μ‚°μˆ  연산보닀 더 높은 νš¨μœ¨μ„±μ„ λ‚΄κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. (ν•˜λ“œμ›¨μ–΄ λ‹¨κ³„μ˜ Multiply-Add Instruction 등이 μ‚¬μš©λ  λ•Œμ²˜λŸΌ)
FP_FAST_FMA - double νƒ€μž…μ˜ μΈμžμ— λŒ€ν•΄ xΓ—y+zx \times y + z만큼 ν˜Ήμ€ κ·Έ μ΄μƒμœΌλ‘œ λΉ λ₯΄κ²Œ μ—°μ‚°ν•œλ‹€.
FP_FAST_FMAF - float νƒ€μž…μ˜ μΈμžμ— λŒ€ν•΄ xΓ—y+zx \times y + z만큼 ν˜Ήμ€ κ·Έ μ΄μƒμœΌλ‘œ λΉ λ₯΄κ²Œ μ—°μ‚°ν•œλ‹€.
FP_FAST_FMAL - long double νƒ€μž…μ˜ μΈμžμ— λŒ€ν•΄ xΓ—y+zx \times y + z만큼 ν˜Ήμ€ κ·Έ μ΄μƒμœΌλ‘œ λΉ λ₯΄κ²Œ μ—°μ‚°ν•œλ‹€.

10. Reference