13 수학 함수

이장은 삼각함수와 같은, 수학적 계산을 수행하는 함수들에 대해서 설명한다. 이들 함수들중 대부분은 헤더파일 'math. h'에 선언되어 있다.

이 함수들 모두는 플로팅-포인트 수를 인수로 받아들여 계산하고, double형으로 결과를 반환한다. 즉, float 와 long double 값들을 계산하는 부가적함수가 될 것이다. 예를 들어, cosf 와 cosl은 float 와 long double 인수들로 수행하는, cos 함수의 변형이다. 동시에, 당신이 그들 예약어를 당신이 임의의 목적으로 사용하는 것을 피하라. 1. 3. 3절 [Reserved Names] 참조.


13. 1 정의구역과 범위 에러들

이 절에서 설명된 함수들의 대부분은 실수(read nunbers)의 부분집합인 정의구역(domain)에 관하여 수학적으로 정의되어 있다. 예를 들어, acos 함수는 -1 과 1 사이의 정의구역으로 정의된다. 만일 당신이 그 함수에서 정의되어 있는 정의구역 밖의 값을 인수로 사용한다면, 그 함수는 errno를 EDOM으로 설정해서 정의구역 에러가 났음을 지적한다. IEEE floating point 를 지원하는 컴퓨터에서, error 로 EDOM을 보고하는 함수들은 또한 NaN 도 반환한다.

이들 함수중 어떤 것은 그들의 정의구역에서 복잡한 값으로 결과를 낸다. 이것과 가장 유사한 예는 음수에 루트를 씌운 것의 결과 값이다. 이 장에 있는 함수들은 오직 실수 인수만을 취하고, 실수 값만을 반환한다. 그래서 만일 실수가 아닌 값이면, 이것을 정의구역 에러로 취급한다.

연관성 있는 문제로 함수의 결과를 플로팅 포인트로 나타낼 수 없는 것이 있다. 만일 정확하게 나온 결과 값의 크기가 나타내기에 너무 크면, 그 함수는 범위 에러임을 지적하기 위해서 ERANGE로 errno를 설정하고, 특별하게 매우 큰 값을 반환하거나( 매크로 HUGE_VAL ), 그것의 부정(negation)의 값을(-HUGE_VAL)을 반환한다. 만일 결과의 크기가 너무 작으면, 0의 값을 대신 반환한다. 이 경우, ERANGE의 에러가 날수도, 또는 나지 않을 수도 있다.

정의구역과 범위에러를 체크하기 위한 좋은 방법은 우선 당신이 수학적 함수를 호출하기 전에 errno를 0으로 설정한 다음, 나중에 errno를 테스트 해보는 것이다. errno를 이같이 사용한 결과로, 당신이 에러들을 체크하면, 그 수학함수를 재진입해서 사용할 수 없다.

수학적 함수들의 어떤 것도 정의구역이나 범위에러로 인해서 결코 신호를 발생시키지 않는다. 이 특별함이 의미하는 것은 이들 함수들의 사용으로는 SIGEPE신호들의 발생을 당신이 볼 수 없다는 것이다. ( 21장 [Signal Handling] 신호에 대한 정보 참조. )

매크로 : double HEGE__VAL

특별히 매우 큰 값을 나타내는 표현. IEEE 플로팅 포인트 형식을 지원하는 기계에서, 그 값은 "무한대"이다. 다른 기계들에서는, 그것은 나타낼 수 있는 가장 큰 양의숫자를 의미한다. 이 매크로의 값은 여러 가지 수학적 함수들이 발생시킬 수 있는 오버플로우 상황에서 반환값을 나타내기 위해서 사용된다.
플로팅 포인트 표현과 그 제한에 대한 자세한 정보는, A. 5. 3. 2절 [Floating Point Parameters] 를 참조하라. 매크로 DBL_MAX는 수학적 함수들로 에러를 테스트하기보다는 다른 용도로 많이 사용한다면 HUGE_VAL보다는 사용하기에 더 적당할 것이다.


13. 2 삼각 함수

이들은 sin, cos, 과 tan 함수들과 유사하다. 이들 함수에 주어질 인수들은 라디안(radians : 호도)의 단위로 주어진다. pi 라디안은 180도와 같다는 것을 상기하라. math 라이브러리에서 pi를 위한 심볼 상수를 정의하지 않았지만, 당신이 만일 필요하다면 당신 스스로 정의할 수 있다.

#define PI 3. 14159265358979323846264338327

당신은 또한 acos(-1. 0)의 표현식으로 pi의 값을 계산할 수 있다.

함수 : double sin (double x)

이 함수는 라디안의 값으로 주어진 x의 sine값을 반환한다. 반환 값은 -1과 1의 범위안에 있다.

함수 : double cos (double x)

이 함수는 라디안의 값으로 주어진 x 의 cosine 값을 반환한다. 반환 값은 -1 과 1 의 범위안에 있다.

함수 : double tan (double x)

이 함수는 라디안의 값으로 주어진 x 의 tangent 값을 반환한다.
다음의 errno는 이 함수를 위해 정의된 에러 상황이다.

ERANGE

수학적으로, tangent 함수는 pi/2 의 홀수배( odd multiples ) 의 특성들을 가진다. 만일인수 x 가 이들 특성들 중 하나에 너무 근접해 있다면, tan은 errno를 ERANGE로 설정하고 음이나 양인 HUGE_VAL 중의 하나를 반환한다.


13. 3 역삼각 함수들

이 절에서는 sine, cosine, tangent 함수들의 역함수인 arc sine, arc cosine, arc tangent 함수들을 설명하고 있다.

함수 : double asin (double x)

이 함수는 x(sine x 의 결과 값인 )의 arc sine의 값을 계산한다. 결과 값은 라디안의 단위이다. 수학적으로, 무한대의 많은 값들이 존재한다; 실제로는 -pi/2 와 pi/2(포함해서) 사이의 하나가 반환된다. 만일 x가 범위밖에 존재하면, asin은 실패하고, errno는 EDOM으로 설정된다. arc sine 함수는 -1 에서 1 사이의 정의구역을 가지도록 정의되었다.

함수 : double acos (double x)

이 함수는 x(cosine x의 결과 값인 )의 arc cosine의 값을 계산한다. 이 값은 라디안의 단위이다. 수학적으로 무한대의 값이 존재한다; 실제로 0 과 pi(포함해서) 사이의 하나가 반환된다. 만일 x 가 범위밖에 존재하면, acos는 실패하고, errno를 EDOM으로 설정한다. arc cosine 함수는 오직 -1에서 1사이의 정의구역을 가지도록 정의됐다.

함수 : double atan (double x)

이 함수는 x(tangent x 의 결과 값인 )의 arc tangent의 값을 계산한다. 이 값은 라디안의 단위이다. 수학적으로 무한대의 값이 존재한다; 실제로는 -pi/2 와 pi/2(포함해서) 사이의 값중 하나가 반환된다.

함수 : double atan2 (double y, double x)

이 함수는 두 개의 인수를 가진 arc tangent 함수이다. 이것은 두 인수의 부호가 결과 값의 4분구간(quadrant)을 결정하는데 사용되고, x의 값으로 0의 사용이 허용된다는 것을 제외하고는, y/x의 arc tangent 값을 계산하는 것과 유사하다. 반환 값은 라디안으로 주어진고, -pi 와 pi를 포함한 그 사이의 범위를 가진다.
만일 x 와 y 가 평면에 위치한 좌표라면, atan2는 x 를 축으로 하고, 원점으로부터 그 점까지 사이의 부호화된 각도를 반환한다. 그래서 atan2는 데카르트 좌표를 극 좌표로 변경하는데 유용하다. ( radial 좌표를 계산하기 위해서는, hypot를 사용하라; 13. 4절 [Exponents and Logarithms] 참조. ) atan2 함수는 x 와 y 가 둘다 0이면 EDOM으로 errno를 설정한다; 반환 값은 이 경우에 정의되지 않았다.


13. 4 지수함수와 대수

함수 : double exp (double x)

exp 함수는 e( 자연대수에 기초한 )의 x 승의 값을 반환한다. 만일 결과의 크기가 너무 커서 나타낼 수 없으면, 그 함수는 실패하고, errno를 ERANGE 로 설정한다.

함수 : double log (double x)

이 함수는 x 의 자연로그를 반환한다. 수학적으로 정확하게, C로는 대략적으로 exp (log (x)) 는 x 와 같다. 다음의 errno는 이 함수를 위해 정의된 에러상황이다.

EDOM

인수 x 가 음수이다. log 함수는 양의 인수가 주어져야지만 실수 결과값을 반환하도록 정의되어있다.

ERANGE  : 인수가 0이다. 0의 로그값은 정의되지 않았다.

함수 : double log10 (double x)

이 함수는 10을 밑으로 하는 x의 로그값을 반환한다. 밑의 값이 다르다는 것을 제외하고는, log 함수와 유사하다. 실제로, log10 (x)는 log (x) / log (10) 과 같다.

함수 : doule pow (double base, double power)

이것은 base의 power승을 반환하는 일반적 지수 함수이다. 다음의 errno는 이 함수를 위해 정의된 에러상황이다.

EDOM

base 인수가 음수이고 power는 정수값이 아니다. 수학적으로, 이 경우에 결과가 복잡하게 나올 것이다.

ERANGE : 결과에서 언더플로우나 오버플로우 상황이 검출되었다.

함수 : double sqrt (double x)

이 함수는 x의 음이 아닌 루트의 값을 반환한다. sqrt 함수는 만일 x가 음수이면 실패하고, errno를 EDOM으로 설정한다. 수학적으로, 루트값은 복잡한 수이다.

함수 : double cbrt(double x)

이 함수는 x 의 세제곱근의 값을 반환한다. 이 함수는 실패할 수 없다; 모든 표현 가능한 실수의 값은 표현 가능한 세제곱근의 값을 가질 수 있다.

함수 : double hypot (double x, double y)

hypot 함수는 sqrt ( x*x + y*y )의 값을 반환한다. (이것은 x 와 y길이의 두변을 가진 직각 삼각형의 빗변의 길이이거나, 원점으로부터 점(x, y) 까지의 거리이다. ) cabs함수에 대한 것은 14. 3절 [Absolute Value] 참조.

함수 : double expml (double x)

이 함수는 exp (x) - 1 과 동일한 값을 반환한다. 그것은 심지어 x가 0에 근접한 값이라 할지라도 정확하게 계산되어진다. _ exp (x) -1은 두수의 차이가 거의 같다면 부정확하게 되어질 것이다.

함수 : double loglp (double x)

이 함수는 log (1 + x)와 동등하다. 이 함수는 심지어 x의 값이 0에 근접해 있을지라도 정확하게 계산되어진다.


13. 5 쌍곡선 함수들

이 절에 있는 함수들은 지수 함수들과 연관이 있다; 13. 4절 [Exponents and Logarithms] 참조.

함수 : double sinh (double x)

sinh 함수는 수학적으로 exp(x) - exp(-x)/2 로 정의된, x의 쌍곡선 sine을 반환한다. 만일 x의 값이 너무 크면 그 함수는 실패하고, errno를 ERANGE 로 설정한다; 그것을 오버플로우의 발생이라고 한다.

함수 : double cosh (double x)

cosh 함수는 수학적으로 exp(x)-exp(-x)/2 로 정의된, x의 쌍곡선 cosine을 반환한다. 만일 x의 값이 너무 크면, 함수는 실패로 끝나고, errno를 ERANGE로 설정한다; 그것을 오버플로우의 발생이라고 한다.

함수 : double tanh (double x)

이 함수는 sinh(x)/cosh(x)이라는 수학적 정의를 가진, x 의 쌍곡선 tangent x를 반환한다.

함수 : double asinh (double x)

이 함수는 쌍곡선 sine이 x 인 값_x의 역 쌍곡선 sine의 값을 반환한다.

함수 : double acosh (double x)

이 함수는 쌍곡선 cosine 이 x 인 값_x의 역 쌍곡선 cosine의 값을 반환한다. 만일 x 가 1보다 작으면, acosh는 HUGE_VAL을 반환한다.

함수 : double atanh (double x)

이 함수는 쌍곡선 tangent가 x인_x의 역 쌍곡선 tangent의 값을 반환한다. 만일 x의 절대값이 1 과 같거나, 1보다 크면, atanh는 HUGE_VAL을 반환한다.


13. 6 의사-난수

이 절은 의사-난수를 발생시키는 GNU 함수들을 설명하고 있다. 그 숫자들은 실제로는 난수가 아니다. 특별히, 그들은 정해진 주기로 반복적으로 숫자열을 형성하는데, 그 주기는 당신이 원래의 목적을 위해서는 무시 가능한, 그렇게 큰 주기이다. 난수 발생기는 다음 난수를 계산하기 위해 사용할 seed를 항상 기억하고 또한 새로운 seed를 계산하기 위해 작업한다.

비록, 발생된 숫자가 프로그램의 처음 실행에서는 예측할 수 없게 보이지만, 숫자들의 열(sequence)은 다음실행에서도 처음과 정확히 동일한 값이 나온다. 이것은 처음 seed값이 항상 동일하기 때문이다. 이것은 프로그램을 디버깅할 때 편리하지만, 만일 당신이 예측 불가능한 행동을 하도록 프로그램을 만들기 원한다면 전혀 도움이 되지 못한다. 만일 당신이

단지 의사-난수가 아닌, 진짜 난수를 원한다면, 현재의 시간을 기반으로 해서 seed를 정하라

당신이 난수를 발생시키기 위해서는 동일한 seed 값으로 정해서 다른 컴퓨터 상에서도 반복적인 임의의 숫자열을 얻을 수 있다. seed값으로는 아무런 표준이 없다. 동일한 seed를 다른 C 라이브러리나, 또는 다른 CPU 타입 상에서 사용하면 당신은 다른 난수들을 얻을 것이다.

GNU 라이브러리는 표준 ANSI C 난수 함수와 더불어 BSD시스템에서 기원된 다른 함수들도 지원한다. 우리는 표준 함수인 rand 와 srand를 사용하기를 권한다.

 

13. 6. 1 ANSI C 난수 함수들

이 절은 ANSI C 표준의 일부분인 난수 함수들을 설명한다. 이들을 사용하기 위해서, 당신은 당신의 프로그램에 헤더파일 'stdlib. h'를 포함시켜야 한다.

매크로 : int RAND__MAX

이 매크로의 값은 rand 함수에 의해 반환된 최대 가능한 값을 표현하기 위한 정수 상수 표현이다. GNU 라이브러리에서, 그것은 32비트에서 표현 가능한 가장 큰 양의 정수값인 037777777이다. 다른 라이브러리에서는 그것은 32767로 작을 것이다.

함수 : int rand ()

rand함수는 차례로 다음 의사-난수를 반환한다. 그 값은 0과 RAND_MAX 사이의 범위이다.

함수 : void srand (unsigned int seed)

이 함수는 의사-난수들의 새로운 열(series)을 위해서 seed로 seed를 만든다. 만일 당신이 srand로 seed를 정하기 전에 rand를 호출하면, 그것은 디폴트값 seed인 1을 사용한다. 실제로 난수를 만들기 위해서는 (단지 의사-난수가 아닌), srand(time(0)) 을 사용하라.

 

13. 6. 2 BSD 난수 함수들

이 절은 BSD에서 기인된 난수 발생 함수들에 대해서 설명한다. GNU C 라이브러리에서 이들 함수를 사용하는 것은 아무런 이득이 없다; 우리는 오직 BSD와의 호환성을 위해서 그들을 지원할 뿐이다. 이들 함수들을 위한 프로토타입은 'stdlib. h'이다.

함수 : long int random ()

이 함수는 차례로 다음 의사-난수를 반환한다. 반환된 값의 범위는 0과 RAND_MAX사이다.

함수 : void srandom (unsigned int seed)

srandom 함수는 정수 seed를 기초로 하는 현재의 난수를 위해서 seed를 설정한다. 만일 당신이 1의 값으로 seed를 공급하면, 이것은 디폴트 난수들을 집합을 재생산하는 결과를 낳는다. 진짜 난수(단지 의사 난수가 아닌)를 만들기 위해서는, sramdom(time(0))을 사용하라.

함수 : void *initstate(unsigned int seed, void *state, size_t size)

initstate 함수는 난수 발생기 상황을 초기화하기 위해서 사용된다. state 인수는 상황에 대한 정보를 저장하고 있는 size 바이트의 배열이다. size는 적어도 8바이트를 가져야만 하고, 최상의 크기는 8, 16, 32, 64, 128, 그리고 256 이다. 배열은 클수록 좋다. 반환 값은 상황 정보 배열의 전의 값이다. 당신은 그 상황을 재저장하기 위해서 setstate의 인수로서 나중에 이 값을 사용할 수 있다.

함수 : void *setstate (void *state)

stetstate 함수는 난수 상황에 대한 정보 state 를 재 저장한다. 인수는 initstate나 또는 setstate의 호출로 얻은 결과를 사용해야만 한다. 반환 값은 상황 정보 배열의 기존의 값이다. 당신은 그 상황을 재저장하기 위해서 stestate에 나중에 이 값을 인수로 사용할 수 있다.