일반 수치 연산(Generic Numerics)
일반 수치 연산(Generic Numerics)
Racket의 대부분의 수치 연산은 어떤 종류의 숫자에서든 동작해요. 정수, 유리수, 실수, 복소수 할 것 없이 같은 연산자를 쓸 수 있습니다.
출처: Racket Reference
본문
대부분의 Racket 수치 연산은 모든 종류의 숫자에서 동작합니다.
산술(Arithmetic)
procedure
(+ z ...) → number?
z : number?
z들을 왼쪽에서 오른쪽으로 쌍으로 더한 합을 반환합니다. 인자가 없으면 결과는 0입니다.
예시:
> (+ 1 2)
3
> (+ 1.0 2+3i 5)
8.0+3.0i
> (+)
0
procedure
(- z) → number?
z : number?
(- z w ...+) → number?
z : number?
w : number?
w가 없으면 (- 0 z)를 반환합니다. 그 외에는 z에서 w들을 왼쪽에서 오른쪽으로 쌍으로 뺀 결과를 반환합니다.
예시:
> (- 5 3.0)
2.0
> (- 1)
-1
> (- 2+7i 1 3)
-2+7i
procedure
(* z ...) → number?
z : number?
z들을 왼쪽에서 오른쪽으로 쌍으로 곱한 곱을 반환합니다. 인자가 없으면 결과는 1입니다. 어떤 수에 정확한(또는 무한대) 0을 곱하면 정확한 0이 만들어집니다.
예시:
> (* 2 3)
6
> (* 8.0 9)
72.0
> (* 1+2i 3+4i)
-5+10i
procedure
(/ z) → number?
z : number?
(/ z w ...+) → number?
z : number?
w : number?
w가 없으면 (/ 1 z)를 반환합니다. 그 외에는 z를 w들로 왼쪽에서 오른쪽으로 쌍으로 나눈 결과를 반환합니다.
z가 정확한 0이고 어떤 w도 정확한 0이 아니면 결과는 정확한 0입니다. 어떤 w가 정확한 0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (/ 3 4)
3/4
> (/ 81 3 3)
9
> (/ 10.0)
0.1
> (/ 1+2i 3+4i)
11/25+2/25i
procedure
(quotient n m) → integer?
n : integer?
m : integer?
(truncate (/ n m))를 반환합니다.
m이 정확한 0, 0.0, 또는 -0.0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (quotient 10 3)
3
> (quotient -10.0 3)
-3.0
> (quotient +inf.0 3)
quotient: contract violation
expected: integer?
given: +inf.0
procedure
(remainder n m) → integer?
n : integer?
m : integer?
n과 같은 부호를 가진 q를 반환합니다. 여기서
(abs q)는 0(포함)과(abs m)(제외) 사이이고,(+ q (* m (quotient n m)))는n과 같습니다.
m이 정확한 0, 0.0, 또는 -0.0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (remainder 10 3)
1
> (remainder -10.0 3)
-1.0
> (remainder 10.0 -3)
1.0
> (remainder -10 -3)
-1
> (remainder +inf.0 3)
remainder: contract violation
expected: integer?
given: +inf.0
procedure
(quotient/remainder n m) → integer? integer?
n : integer?
m : integer?
(values (quotient n m) (remainder n m))를 반환하지만, 조합이 quotient와 remainder를 각각 호출하는 것보다 더 효율적으로 계산될 수 있습니다.
m이 정확한 0, 0.0, 또는 -0.0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (quotient/remainder 10 3)
3
1
procedure
(modulo n m) → integer?
n : integer?
m : integer?
m과 같은 부호를 가진 q를 반환합니다. 여기서
(abs q)는 0(포함)과(abs m)(제외) 사이이고,q와(- n (* m (quotient n m)))의 차이는m의 배수입니다.
m이 정확한 0, 0.0, 또는 -0.0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (modulo 10 3)
1
> (modulo -10.0 3)
2.0
> (modulo 10.0 -3)
-2.0
> (modulo -10 -3)
-1
> (modulo +inf.0 3)
modulo: contract violation
expected: integer?
given: +inf.0
procedure
(add1 z) → number?
z : number?
(+ z 1)을 반환합니다.
procedure
(sub1 z) → number?
z : number?
(- z 1)을 반환합니다.
procedure
(abs x) → number?
x : real?
x의 절댓값을 반환합니다.
예시:
> (abs 1.0)
1.0
> (abs -1)
1
procedure
(max x ...+) → real?
x : real?
x들 중 가장 큰 값을 반환하거나, 어떤 x가 +nan.0이면 +nan.0을 반환합니다. 어떤 x가 부정확하면 결과도 부정확으로 강제됩니다. argmax도 함께 보세요.
예시:
> (max 1 3 2)
3
> (max 1 3 2.0)
3.0
procedure
(min x ...+) → real?
x : real?
x들 중 가장 작은 값을 반환하거나, 어떤 x가 +nan.0이면 +nan.0을 반환합니다. 어떤 x가 부정확하면 결과도 부정확으로 강제됩니다. argmin도 함께 보세요.
예시:
> (min 1 3 2)
1
> (min 1 3 2.0)
1.0
procedure
(gcd n ...) → rational?
n : rational?
n들의 최대공약수(음이 아닌 수)를 반환합니다. 정수가 아닌 n에 대해서는, 결과는 분자의 gcd를 분모의 lcm으로 나눈 것입니다. 인자가 없으면 결과는 0입니다. 모든 인자가 0이면 결과는 0입니다.
예시:
> (gcd 10)
10
> (gcd 12 81.0)
3.0
> (gcd 1/2 1/3)
1/6
procedure
(lcm n ...) → (or/c rational? +inf.0)
n : rational?
n들의 최소공배수(음이 아닌 수)를 반환합니다. 두 개의 정수가 아닌 n에 대해서는, 결과는 곱의 절댓값을 gcd로 나눈 것입니다. 인자가 없으면 결과는 1입니다. 어떤 인자가 0이면 결과는 0입니다. 게다가 어떤 인자가 정확한 0이면 결과는 정확한 0입니다.
예시:
> (lcm 10)
10
> (lcm 3 4.0)
12.0
> (lcm 1/2 2/3)
2
procedure
(round x) → (or/c integer? +inf.0 -inf.0 +nan.0)
x : real?
x에 가장 가까운 정수를 반환하며, 동점은 짝수를 선호해 해결하고, +inf.0, -inf.0, +nan.0은 자기 자신으로 반올림됩니다.
예시:
> (round 17/4)
4
> (round -17/4)
-4
> (round 2.5)
2.0
> (round -2.5)
-2.0
> (round +inf.0)
+inf.0
procedure
(floor x) → (or/c integer? +inf.0 -inf.0 +nan.0)
x : real?
x보다 크지 않은 가장 큰 정수를 반환하지만, +inf.0, -inf.0, +nan.0은 자기 자신으로 내림됩니다.
예시:
> (floor 17/4)
4
> (floor -17/4)
-5
> (floor 2.5)
2.0
> (floor -2.5)
-3.0
> (floor +inf.0)
+inf.0
procedure
(ceiling x) → (or/c integer? +inf.0 -inf.0 +nan.0)
x : real?
x보다 작지 않은 가장 작은 정수를 반환하지만, +inf.0, -inf.0, +nan.0은 자기 자신으로 올림됩니다.
예시:
> (ceiling 17/4)
5
> (ceiling -17/4)
-4
> (ceiling 2.5)
3.0
> (ceiling -2.5)
-2.0
> (ceiling +inf.0)
+inf.0
procedure
(truncate x) → (or/c integer? +inf.0 -inf.0 +nan.0)
x : real?
0에서 멀어지지 않으면서 0에서 가장 멀리 있는 정수를 반환합니다. x보다 0에서 더 멀지 않은 정수 중, +inf.0, -inf.0, +nan.0은 자기 자신으로 절사됩니다.
예시:
> (truncate 17/4)
4
> (truncate -17/4)
-4
> (truncate 2.5)
2.0
> (truncate -2.5)
-2.0
> (truncate +inf.0)
+inf.0
procedure
(numerator q) → integer?
q : rational?
q를 정확한 수로 강제하고, 가장 간단한 분수 형태로 표현된 수의 분자를 찾아, 이 수를 q의 정확성(exactness)으로 강제해 반환합니다.
예시:
> (numerator 5)
5
> (numerator 17/4)
17
> (numerator 2.3)
2589569785738035.0
procedure
(denominator q) → (and/c integer? positive?)
q : rational?
q를 정확한 수로 강제하고, 가장 간단한 분수 형태로 표현된 수의 분모를 찾아, 이 수를 q의 정확성으로 강제해 반환합니다.
예시:
> (denominator 5)
1
> (denominator 17/4)
4
> (denominator 2.3)
1125899906842624.0
procedure
(rationalize x tolerance) → real?
x : real?
tolerance : real?
x의 (abs tolerance) 안에 있는 실수들 중에서, 분모가 가장 작은 정확한 수에 해당하는 것을 반환합니다. x의 tolerance 안에 정수가 여러 개 있으면 0에 가장 가까운 것이 사용됩니다.
예시:
> (rationalize 1/4 1/10)
1/3
> (rationalize -1/4 1/10)
-1/3
> (rationalize 1/4 1/4)
0
> (rationalize 11/40 1/4)
1/2
수 비교(Number Comparison)
procedure
(= z w ...) → boolean?
z : number?
w : number?
인자들이 모두 수치적으로 같으면 #t, 그 외에는 #f를 반환합니다. 부정확한 수는 그 부정확한 수의 정확한 강제가 정확한 수일 때 정확한 수와 수치적으로 같습니다. 또한 0.0과 -0.0은 수치적으로 같지만, +nan.0은 자기 자신과 수치적으로 같지 않습니다.
예시:
> (= 1 1.0)
#t
> (= 1 2)
#f
> (= 2+3i 2+3i 2+3i)
#t
> (= 1)
#t
package base의 7.0.0.13 버전에서 변경: 두 개 이상의 인자를 허용하는 것에 더해 하나의 인자도 허용합니다.
procedure
(< x y ...) → boolean?
x : real?
y : real?
주어진 순서의 인자들이 엄격히 증가하면 #t, 그 외에는 #f를 반환합니다.
예시:
> (< 1 1)
#f
> (< 1 2 3)
#t
> (< 1)
#t
> (< 1 +inf.0)
#t
> (< 1 +nan.0)
#f
package base의 7.0.0.13 버전에서 변경: 두 개 이상의 인자를 허용하는 것에 더해 하나의 인자도 허용합니다.
procedure
(<= x y ...) → boolean?
x : real?
y : real?
주어진 순서의 인자들이 감소하지 않으면 #t, 그 외에는 #f를 반환합니다.
예시:
> (<= 1 1)
#t
> (<= 1 2 1)
#f
package base의 7.0.0.13 버전에서 변경: 두 개 이상의 인자를 허용하는 것에 더해 하나의 인자도 허용합니다.
procedure
(> x y ...) → boolean?
x : real?
y : real?
주어진 순서의 인자들이 엄격히 감소하면 #t, 그 외에는 #f를 반환합니다.
예시:
> (> 1 1)
#f
> (> 3 2 1)
#t
> (> +inf.0 1)
#t
> (> +nan.0 1)
#f
package base의 7.0.0.13 버전에서 변경: 두 개 이상의 인자를 허용하는 것에 더해 하나의 인자도 허용합니다.
procedure
(>= x y ...) → boolean?
x : real?
y : real?
주어진 순서의 인자들이 증가하지 않으면 #t, 그 외에는 #f를 반환합니다.
예시:
> (>= 1 1)
#t
> (>= 1 2 1)
#f
package base의 7.0.0.13 버전에서 변경: 두 개 이상의 인자를 허용하는 것에 더해 하나의 인자도 허용합니다.
거듭제곱과 제곱근(Powers and Roots)
procedure
(sqrt z) → number?
z : number?
z의 주제곱근(principal square root)을 반환합니다. z가 정확하고 z의 제곱근이 유리수이면 결과는 정확합니다. integer-sqrt도 함께 보세요.
예시:
> (sqrt 4/9)
2/3
> (sqrt 2)
1.4142135623730951
> (sqrt -1)
0+1i
procedure
(integer-sqrt n) → complex?
n : integer?
양수 n에 대해 (floor (sqrt n))을 반환합니다. n이 정확하면 결과는 정확합니다. 음수 n에 대해 결과는 (* (integer-sqrt (- n)) 0+1i)입니다.
예시:
> (integer-sqrt 4.0)
2.0
> (integer-sqrt 5)
2
> (integer-sqrt -4.0)
0.0+2.0i
> (integer-sqrt -4)
0+2i
procedure
(integer-sqrt/remainder n) → complex? integer?
n : integer?
(integer-sqrt n)과 (- n (expt (integer-sqrt n) 2))을 반환합니다.
예시:
> (integer-sqrt/remainder 4.0)
2.0
0.0
> (integer-sqrt/remainder 5)
2
1
procedure
(expt z w) → number?
z : number?
w : number?
z를 w의 거듭제곱으로 올린 값을 반환합니다.
w가 정확한 0이면 결과는 정확한 1입니다. w가 0.0 또는 -0.0이고 z가 정확한 1이나 0이 아닌 실수이면 결과는 1.0입니다(z가 +nan.0이어도).
z가 정확한 1이면 결과는 정확한 1입니다. z가 1.0이고 w가 실수이면 결과는 1.0입니다(w가 +nan.0이어도).
z가 정확한 0이면 결과는 다음과 같습니다:
w가 정확한 0 — 결과는 1w가 0.0 또는 -0.0 — 결과는 1.0w의 실수부가 음수 —exn:fail:contract:divide-by-zero예외 발생w가 양수가 아닌 실수부를 가진 비실수 —exn:fail:contract:divide-by-zero예외 발생w가+nan.0— 결과는+nan.0- 그 외 — 결과는 0
w가 정확한 1/2이면 결과는 (sqrt z)와 같으며, 정확할 수 있습니다. 다른 분수 거듭제곱은 이런 식으로 특별 취급되지 않습니다:
예시:
> (expt 9 1/2)
3
> (expt 9 0.5)
3.0
> (expt 16 1/4)
2.0
> (expt 16 0.25)
2.0
w가 실수일 때 추가 특별 경우들:
이 특별 경우들은 z가 음수이고 w가 정수가 아닐 때를 제외하면 C99 [C99]의 pow에 해당합니다.
(expt 0.0 w):
w가 음수 — 결과는+inf.0w가 양수 — 결과는 0.0
(expt -0.0 w):
w가 음수:w가 홀수 정수 — 결과는-inf.0w가 그 외의 유리수 — 결과는+inf.0
w가 양수:w가 홀수 정수 — 결과는-0.0w가 그 외의 유리수 — 결과는 0.0
양수 z에 대한 (expt z -inf.0):
z가 1.0보다 작음 — 결과는+inf.0z가 1.0보다 큼 — 결과는 0.0
양수 z에 대한 (expt z +inf.0):
z가 1.0보다 작음 — 결과는 0.0z가 1.0보다 큼 — 결과는+inf.0
정수 w에 대한 (expt -inf.0 w):
w가 음수:w가 홀수 — 결과는-0.0w가 짝수 — 결과는 0.0
w가 양수:w가 홀수 — 결과는-inf.0w가 짝수 — 결과는+inf.0
(expt +inf.0 w):
w가 음수 — 결과는 0.0w가 양수 — 결과는+inf.0
예시:
> (expt 2 3)
8
> (expt 4 0.5)
2.0
> (expt +inf.0 0)
1
procedure
(exp z) → number?
z : number?
오일러 수(Euler's number)를 z의 거듭제곱으로 올린 값을 반환합니다. 결과는 보통 부정확하지만, z가 정확한 0이면 정확한 1입니다. expt도 함께 보세요.
예시:
> (exp 1)
2.718281828459045
> (exp 2+3i)
-7.315110094901103+1.0427436562359045i
> (exp 0)
1
procedure
(log z [b]) → number?
z : number?
b : number? = (exp 1)
z의 자연로그를 반환합니다. 결과는 보통 부정확하지만, z가 정확한 1이면 정확한 0입니다. z가 정확한 0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
b가 제공되면 대체 밑(base)으로 작동합니다. 그것은 (/ (log z) (log b))와 동등하지만, 잠재적으로 더 빠르게 실행될 수 있습니다. b가 정확한 1이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
정확도가 중요할 때는 math/flonum의 fllogb를 사용하는 것을 고려하세요.
예시:
> (log (exp 1))
1.0
> (log 2+3i)
1.2824746787307684+0.982793723247329i
> (log 1)
0
> (log 100 10)
2.0
> (log 8 2)
3.0
> (log 5 5)
1.0
package base의 6.9.0.1 버전에서 변경: 임의의 밑을 위한 두 번째 인자가 추가되었습니다.
삼각 함수(Trigonometric Functions)
procedure
(sin z) → number?
z : number?
z의 사인(sine)을 반환합니다. z는 라디안 단위입니다. 결과는 보통 부정확하지만, z가 정확한 0이면 정확한 0입니다.
예시:
> (sin 3.14159)
2.65358979335273e-6
> (sin 1.0+5.0i)
62.44551846769654+40.0921657779984i
procedure
(cos z) → number?
z : number?
z의 코사인(cosine)을 반환합니다. z는 라디안 단위입니다.
예시:
> (cos 3.14159)
-0.9999999999964793
> (cos 1.0+5.0i)
40.09580630629883-62.43984868079963i
procedure
(tan z) → number?
z : number?
z의 탄젠트(tangent)를 반환합니다. z는 라디안 단위입니다. 결과는 보통 부정확하지만, z가 정확한 0이면 정확한 0입니다.
예시:
> (tan 0.7854)
1.0000036732118496
> (tan 1.0+5.0i)
8.256719834229597e-5+1.0000377833796008i
procedure
(asin z) → number?
z : number?
z의 라디안 단위 아크사인(arcsine)을 반환합니다. 결과는 보통 부정확하지만, z가 정확한 0이면 정확한 0입니다.
예시:
> (asin 0.25)
0.25268025514207865
> (asin 1.0+5.0i)
0.1937931365549322+2.3309746530493123i
procedure
(acos z) → number?
z : number?
z의 라디안 단위 아크코사인(arccosine)을 반환합니다.
예시:
> (acos 0.25)
1.318116071652818
> (acos 1.0+5.0i)
1.3770031902399644-2.3309746530493123i
procedure
(atan z) → number?
z : number?
(atan y x) → number?
y : real?
x : real?
인자 하나의 경우, z의 부정확한 근사치의 아크탄젠트를 반환합니다. 단, z가 0이면 결과는 정확한 0이고, z가 정확한 0+1i 또는 정확한 0-1i이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
인자 두 개의 경우, 결과는 대략 (atan (/ (exact->inexact y)) (exact->inexact x))와 같지만, y와 x의 부호가 결과의 사분면을 결정합니다. 게다가 y가 x로 나뉘었을 때 y도 x도 +nan.0이 아닌데 +nan.0이 만들어지면 적절한 각도가 반환됩니다. 마지막으로, y가 정확한 0이고 x가 양수이면 결과는 정확한 0입니다. x와 y가 둘 다 정확한 0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (atan 0.5)
0.4636476090008061
> (atan 2 1)
1.1071487177940904
> (atan -2 -1)
-2.0344439357957027
> (atan 1.0+5.0i)
1.530881333938778+0.19442614214700213i
> (atan +inf.0 -inf.0)
2.356194490192345
package base의 7.2.0.2 버전에서 변경: 0+1i와 0-1i에 대해 exn:fail:contract:divide-by-zero를 발생시키고, y가 0일 때 임의의 양수 x(정확한 값뿐 아니라)에 대해 정확한 0을 만들어내도록 변경되었습니다.
복소수(Complex Numbers)
procedure
(make-rectangular x y) → number?
x : real?
y : real?
x를 실수부로, y를 허수부로 가진 복소수를 만듭니다. 즉 (+ x (* y 0+1i))를 반환합니다.
예시:
> (make-rectangular 3 4.0)
3.0+4.0i
procedure
(make-polar magnitude angle) → number?
magnitude : real?
angle : real?
점으로 생각했을 때 원점에서 magnitude만큼 떨어져 있고, 양의 x축에서 반시계 방향으로 angle 라디안만큼 회전한 복소수를 만듭니다. 즉 (+ (* magnitude (cos angle)) (* magnitude (sin angle) 0+1i))를 반환합니다.
예시:
> (make-polar 10 (* pi 1/2))
6.123233995736766e-16+10.0i
> (make-polar 10 (* pi 1/4))
7.0710678118654755+7.071067811865475i
procedure
(real-part z) → real?
z : number?
직각 좌표에서 복소수 z의 실수부를 반환합니다.
예시:
> (real-part 3+4i)
3
> (real-part 5.0)
5.0
procedure
(imag-part z) → real?
z : number?
직각 좌표에서 복소수 z의 허수부를 반환합니다.
예시:
> (imag-part 3+4i)
4
> (imag-part 5.0)
0
> (imag-part 5.0+0.0i)
0.0
procedure
(magnitude z) → (and/c real? (not/c negative?))
z : number?
극 좌표에서 복소수 z의 크기(magnitude)를 반환합니다. +inf.0 또는 -inf.0을 성분으로 가진 복소수는 다른 성분이 +nan.0이어도 크기가 +inf.0입니다.
예시:
> (magnitude -3)
3
> (magnitude 3.0)
3.0
> (magnitude 3+4i)
5
package base의 7.2.0.2 버전에서 변경: +inf.0 또는 -inf.0 성분을 가진 복소수에 대해 항상 +inf.0을 반환하도록 변경되었습니다.
procedure
(angle z) → real?
z : number?
극 좌표에서 복소수 z의 각도(angle)를 반환합니다.
결과는 (- pi)와 pi 사이임이 보장됩니다. pi와 같을 수는 있지만 (- pi)와는 절대 같지 않습니다.
z가 정확한 0이면 exn:fail:contract:divide-by-zero 예외가 발생합니다.
예시:
> (angle -3)
3.141592653589793
> (angle 3.0)
0
> (angle 3+4i)
0.9272952180016122
> (angle +inf.0+inf.0i)
0.7853981633974483
> (angle -1)
3.141592653589793
비트 연산(Bitwise Operations)
procedure
(bitwise-ior n ...) → exact-integer?
n : exact-integer?
n들의 (반무한) 2의 보수 표현에서 비트별 "inclusive or"를 반환합니다. 인자가 없으면 결과는 0입니다.
예시:
> (bitwise-ior 1 2)
3
> (bitwise-ior -32 1)
-31
procedure
(bitwise-and n ...) → exact-integer?
n : exact-integer?
n들의 (반무한) 2의 보수 표현에서 비트별 "and"를 반환합니다. 인자가 없으면 결과는 -1입니다.
예시:
> (bitwise-and 1 2)
0
> (bitwise-and -32 -1)
-32
procedure
(bitwise-xor n ...) → exact-integer?
n : exact-integer?
n들의 (반무한) 2의 보수 표현에서 비트별 "exclusive or"를 반환합니다. 인자가 없으면 결과는 0입니다.
예시:
> (bitwise-xor 1 5)
4
> (bitwise-xor -32 -1)
31
procedure
(bitwise-not n) → exact-integer?
n : exact-integer?
n의 (반무한) 2의 보수 표현에서 비트별 "not"을 반환합니다.
예시:
> (bitwise-not 5)
-6
> (bitwise-not -1)
0
procedure
(bitwise-bit-set? n m) → boolean?
n : exact-integer?
m : exact-nonnegative-integer?
n의 (반무한) 2의 보수 표현에서 n의 m번째 비트가 설정되어 있으면 #t를 반환합니다.
이 연산은 (not (zero? (bitwise-and n (arithmetic-shift 1 m))))과 동등하지만, n이 양수일 때 더 빠르고 상수 시간에 실행됩니다.
예시:
> (bitwise-bit-set? 5 0)
#t
> (bitwise-bit-set? 5 2)
#t
> (bitwise-bit-set? -5 (expt 2 700))
#t
procedure
(bitwise-first-bit-set n) → exact-integer?
n : exact-integer?
n이 0이면 -1을, 그 외에는 (bitwise-bit-set? n m)이 #t를 만들어내는 가장 작은 m을 반환합니다.
예시:
> (bitwise-first-bit-set 128)
7
package base의 8.16.0.4 버전에서 추가되었습니다.
procedure
(bitwise-bit-field n start end) → exact-integer?
n : exact-integer?
start : exact-nonnegative-integer?
end : (and/c exact-nonnegative-integer? (>=/c start))
n에서 위치 start와 (- end 1)(포함) 사이의 비트를 추출하고, 숫자의 최하위 부분으로 내립니다.
이 연산은 계산
(bitwise-and (sub1 (arithmetic-shift 1 (- end start)))
(arithmetic-shift n (- start)))
과 동등하지만, n이 양수이고 start와 end가 fixnum이며 (- end start)가 fixnum의 최대 폭을 넘지 않을 때 상수 시간에 실행됩니다.
아래 예시 쌍들은 각각 같은 숫자를 사용하며, 결과를 이진수와 정수로 모두 보여줍니다.
예시:
> (format "~b" (bitwise-bit-field (string->number "1101" 2) 1 1))
"0"
> (bitwise-bit-field 13 1 1)
0
> (format "~b" (bitwise-bit-field (string->number "1101" 2) 1 3))
"10"
> (bitwise-bit-field 13 1 3)
2
> (format "~b" (bitwise-bit-field (string->number "1101" 2) 1 4))
"110"
> (bitwise-bit-field 13 1 4)
6
procedure
(arithmetic-shift n m) → exact-integer?
n : exact-integer?
m : exact-integer?
n의 (반무한) 2의 보수 표현에서 비트별 "shift"를 반환합니다. m이 음이 아니면 정수 n을 m 비트만큼 왼쪽으로 이동합니다. 즉, m개의 새 0이 최하위 자리로 도입됩니다. m이 음수이면 n을 (- m) 비트만큼 오른쪽으로 이동합니다. 즉, 최하위 m 자리가 버려집니다.
예시:
> (arithmetic-shift 1 10)
1024
> (arithmetic-shift 255 -3)
31
procedure
(integer-length n) → exact-integer?
n : exact-integer?
(음이 아닌 n에 대해) 모든 선행 0을 제거한 후, 또는 (음수 n에 대해) 모든 선행 1을 제거한 후, n의 (반무한) 2의 보수 표현의 비트 수를 반환합니다.
예시:
> (integer-length 8)
4
> (integer-length -8)
3
난수(Random Numbers)
procedure
(random k [rand-gen]) → exact-nonnegative-integer?
k : (integer-in 1 4294967087)
rand-gen : pseudo-random-generator? = (current-pseudo-random-generator)
(random min max [rand-gen]) → exact-integer?
min : exact-integer?
max : (integer-in (+ 1 min) (+ 4294967087 min))
rand-gen : pseudo-random-generator? = (current-pseudo-random-generator)
(random [rand-gen]) → (and/c real? inexact? (>/c 0) (</c 1))
rand-gen : pseudo-random-generator? = (current-pseudo-random-generator)
정수 인자 k로 호출되면 0에서 k-1 범위의 무작위 정확한 정수를 반환합니다.
두 정수 인자 min과 max로 호출되면 min에서 max-1 범위의 무작위 정확한 정수를 반환합니다.
인자 없이 호출되면 0과 1 사이(제외)의 무작위 부정확한 수를 반환합니다.
각 경우 숫자는 주어진 의사난수 생성기(기본값은 current-pseudo-random-generator가 만든 현재 생성기)가 제공합니다. 생성기는 숫자를 만들기 위한 내부 상태를 유지합니다. 난수 생성기는 실질적으로 192비트의 상태 공간을 가진 L'Ecuyer의 MRG32k3a 알고리즘 [L'Ecuyer02]을 사용합니다.
보안이 걱정되는 상황에서는 random 대신 crypto-random-bytes를 사용하세요.
math/base 라이브러리는 4294967087의 한계 없이 난수를 만드는 추가 함수를 제공합니다.
package base의 6.4 버전에서 변경: 범위에 대한 지원이 추가되었습니다.
procedure
(random-seed k) → void?
k : (integer-in 0 (sub1 (expt 2 31)))
현재 의사난수 생성기를 k로 시드합니다. 생성기를 시드하면 내부 상태를 결정론적으로 설정합니다. 즉, 특정 숫자로 생성기를 시드하면 실행 간·플랫폼 간에 같은 의사난수 시퀀스를 만들어내도록 강제합니다.
random-seed 함수는 어떤 목적에는 편리하지만, 의사난수 생성기의 상태 공간이 k의 허용 값 공간보다 훨씬 크다는 점을 유의하세요. vector->pseudo-random-generator!를 사용해 의사난수 생성기를 가능한 상태 중 어떤 것으로든 설정하세요.
procedure
(make-pseudo-random-generator) → pseudo-random-generator?
새 의사난수 생성기를 반환합니다. 새 생성기는 (current-milliseconds)에서 파생된 숫자로 시드됩니다.
procedure
(pseudo-random-generator? v) → boolean?
v : any/c
v가 의사난수 생성기이면 #t, 그 외에는 #f를 반환합니다.
parameter
(current-pseudo-random-generator) → pseudo-random-generator?
(current-pseudo-random-generator rand-gen) → void?
rand-gen : pseudo-random-generator?
random이 사용하는 의사난수 생성기를 결정하는 파라미터입니다.
procedure
(pseudo-random-generator->vector rand-gen) → pseudo-random-generator-vector?
rand-gen : pseudo-random-generator?
rand-gen의 완전한 내부 상태를 나타내는 벡터를 만들어냅니다. 그 벡터는 vector->pseudo-random-generator의 인자로 적합해 (실행 간·플랫폼 간에) 현재 상태의 생성기를 재현할 수 있습니다.
procedure
(vector->pseudo-random-generator vec) → pseudo-random-generator?
vec : pseudo-random-generator-vector?
내부 상태가 vec에 해당하는 의사난수 생성기를 만들어냅니다.
procedure
(vector->pseudo-random-generator! rand-gen vec) → void?
rand-gen : pseudo-random-generator?
vec : pseudo-random-generator-vector?
vector->pseudo-random-generator와 같지만, 새 생성기를 만들지 않고 rand-gen을 주어진 상태로 바꿉니다.
procedure
(pseudo-random-generator-vector? v) → boolean?
v : any/c
v가 여섯 개의 정확한 정수의 벡터이면 #t를 반환합니다. 여기서 처음 세 정수는 0에서 4294967086(포함) 범위이고, 마지막 세 정수는 0에서 4294944442(포함) 범위이며, 처음 세 정수 중 적어도 하나는 0이 아니고, 마지막 세 정수 중 적어도 하나는 0이 아닙니다. 그 외에는 결과가 #f입니다.
기타 난수 유틸리티(Other Randomness Utilities)
(require racket/random) ; package: base
procedure
(crypto-random-bytes n) → bytes?
n : exact-positive-integer?
기본 운영체제의 무작위성에 대한 인터페이스를 제공합니다. 보안이 걱정되는 곳이면 어디서든 random 대신 crypto-random-bytes를 사용하세요.
n개의 무작위 바이트를 반환합니다. Unix 시스템에서는 바이트가 /dev/urandom에서 얻어지고, Windows는 RtlGenRand 시스템 함수를 사용합니다.
예시:
> (crypto-random-bytes 14)
#"\0\1\1\2\3\5\b\r\25\"7Y\220\351"
package base의 6.3 버전에서 추가되었습니다.
procedure
(random-ref seq [rand-gen]) → any/c
seq : sequence?
rand-gen : pseudo-random-generator? = (current-pseudo-random-generator)
시퀀스의 무작위 요소를 반환합니다. sequence-length처럼 무한 시퀀스에서는 끝나지 않고, 전체 시퀀스를 평가합니다.
package base의 6.4 버전에서 추가되었습니다.
procedure
(random-sample seq n
[rand-gen #:replacement? replacement?]) → (listof any/c)
seq : sequence?
n : exact-positive-integer?
rand-gen : pseudo-random-generator? = (current-pseudo-random-generator)
replacement? : any/c = #t
seq의 n개 요소의 리스트를 무작위로 골라 어떤 순서로든 나열해 반환합니다. replacement?가 거짓이 아니면 요소를 복원(replacement)하며 뽑아 중복을 허용합니다.
sequence-length처럼 무한 시퀀스에서는 끝나지 않고, 전체 시퀀스를 평가합니다.
package base의 6.4 버전에서 추가되었습니다.
수–문자열 변환(Number–String Conversions)
procedure
(number->string z [radix]) → string?
z : number?
radix : (or/c 2 8 10 16) = 10
radix가 지정한 밑(base)에서 z의 인쇄 형태를 나타내는 문자열을 반환합니다(Printing Numbers 참고). z가 부정확하면 radix는 10이어야 하며, 그렇지 않으면 exn:fail:contract 예외가 발생합니다.
예시:
> (number->string 3.0)
"3.0"
> (number->string 255 8)
"377"
procedure
(string->number s
[radix convert-mode decimal-mode single-mode])
→ (or/c number? #f string? extflonum?)
s : string?
radix : (integer-in 2 16) = 10
convert-mode : (or/c 'number-or-false 'read) = 'number-or-false
decimal-mode : (or/c 'decimal-as-inexact 'decimal-as-exact)
= (if (read-decimal-as-inexact)
'decimal-as-inexact
'decimal-as-exact)
single-mode : (or/c 'single 'double)
= (if (read-single-flonum)
'single
'double)
s에서 숫자 datum을 읽고 반환합니다(Reading Numbers 참고). 선택적 radix 인자는 숫자의 기본 밑을 지정하며, 문자열의 #b, #o, #d, #x로 덮어쓸 수 있습니다.
convert-mode가 'number-or-false이면 s가 (공백 없이) 숫자 datum으로 정확히 파싱되지 않으면 결과는 #f입니다. convert-mode가 'read이면 결과는 extflonum일 수 있고, s에 대한 read가 리더 예외를 보고하면 오류 메시지를 담은 문자열일 수 있습니다(하지만 read가 심볼을 보고하면 결과는 여전히 #f일 수 있습니다).
decimal-mode 인자는 read-decimal-as-inexact 파라미터가 read에 영향을 주는 것과 같은 방식으로 숫자 파싱을 제어합니다.
single-mode 인자는 read-single-flonum 파라미터가 read에 영향을 주는 것과 같은 방식으로 숫자 파싱을 제어합니다.
예시:
> (string->number "3.0+2.5i")
3.0+2.5i
> (string->number "hello")
#f
> (string->number "111" 7)
57
> (string->number "#b111" 7)
7
> (string->number "#e+inf.0" 10 'read)
"no exact representation for +inf.0"
> (string->number "10.3" 10 'read 'decimal-as-exact)
103/10
package base의 6.8.0.2 버전에서 변경: convert-mode와 decimal-mode 인자가 추가되었습니다.
7.3.0.5 버전에서 변경: single-mode 인자가 추가되었습니다.
procedure
(real->decimal-string n [decimal-digits]) → string?
n : rational?
decimal-digits : exact-nonnegative-integer? = 2
n을 문자열로 인쇄하고 그 문자열을 반환합니다. n의 인쇄 형태는 소수점 뒤에 정확히 decimal-digits 자리의 숫자를 보여줍니다. 인쇄 형태는 n이 음수이면 마이너스 부호를 사용하고, 양수이면 플러스 부호를 사용하지 않습니다.
인쇄 전에 n은 정확한 수로 변환되고, (expt 10 decimal-digits)로 곱해지고, 반올림된 다음, 다시 (expt 10 decimal-digits)로 나뉩니다. 이 과정의 결과는 소수점 뒤에 decimal-digits 자리를 넘지 않는 십진 표현을 가진 정확한 수입니다(필요하면 뒤에 0으로 채워집니다).
n이 십진 표현이 없는 실수라면(예: +nan.0, +inf.0) exn:fail:contract 예외가 발생합니다. (십진 표기로 변환 가능한 어떤 실수도 유리수이므로, 함수 이름에도 불구하고 n은 rational?여야 합니다.)
예시:
> (real->decimal-string pi)
"3.14"
> (real->decimal-string pi 5)
"3.14159"
procedure
(integer-bytes->integer bstr signed?
[big-endian? start end]) → exact-integer?
bstr : bytes?
signed? : any/c
big-endian? : any/c = (system-big-endian?)
start : exact-nonnegative-integer? = 0
end : exact-nonnegative-integer? = (bytes-length bstr)
bstr에 인코딩된 머신-형식 숫자를 정확한 정수로 변환합니다. start와 end 인자는 디코딩할 부분 문자열을 지정하며, (- end start)는 1, 2, 4, 8이어야 합니다. signed?가 참이면 바이트를 2의 보수 숫자로 디코딩하고, 그 외에는 부호 없는 정수로 디코딩합니다. big-endian?가 참이면 첫 번째 바이트의 값이 숫자의 최상위 8비트를 제공하고, 그 외에는 첫 번째 바이트가 최하위 8비트를 제공하는 식입니다.
package base의 6.10.0.1 버전에서 변경: 1바이트 문자열 디코딩 지원이 추가되었습니다.
procedure
(integer->integer-bytes n size-n signed?
[big-endian? dest-bstr start]) → bytes?
n : exact-integer?
size-n : (or/c 1 2 4 8)
signed? : any/c
big-endian? : any/c = (system-big-endian?)
dest-bstr : (and/c bytes? (not/c immutable?)) = (make-bytes size-n)
start : exact-nonnegative-integer? = 0
정확한 정수 n을 길이 size-n(1, 2, 4, 8이어야 함)의 바이트 문자열에 인코딩된 머신-형식 숫자로 변환합니다. signed?가 참이면 숫자를 2의 보수로 인코딩하고, 그 외에는 부호 없는 비트 스트림으로 인코딩합니다. big-endian?가 참이면 숫자의 최상위 8비트가 결과 바이트 문자열의 첫 번째 바이트에 인코딩되고, 그 외에는 최하위 비트가 첫 번째 바이트에 인코딩되는 식입니다.
dest-bstr 인자는 길이 size-n의 가변(mutable) 바이트 문자열이어야 합니다. n의 인코딩은 오프셋 start부터 dest-bstr에 쓰여지고, dest-bstr이 결과로 반환됩니다.
n을 요청된 크기와 형식의 바이트 문자열로 인코딩할 수 없으면 exn:fail:contract 예외가 발생합니다. dest-bstr이 길이 size-n이 아니면 exn:fail:contract 예외가 발생합니다.
package base의 6.10.0.1 버전에서 변경: 1바이트 값 인코딩 지원이 추가되었습니다.
procedure
(floating-point-bytes->real bstr
[big-endian? start end]) → flonum?
bstr : bytes?
big-endian? : any/c = (system-big-endian?)
start : exact-nonnegative-integer? = 0
end : exact-nonnegative-integer? = (bytes-length bstr)
bstr의 위치 start(포함)에서 end(제외)까지 인코딩된 IEEE 부동소수점 숫자를 부정확한 실수로 변환합니다. start와 end의 차이는 4 또는 8바이트여야 합니다. big-endian?가 참이면 첫 번째 바이트의 ASCII 값이 IEEE 표현의 최상위 8비트를 제공하고, 그 외에는 첫 번째 바이트가 최하위 8비트를 제공하는 식입니다.
procedure
(real->floating-point-bytes x size-n
[big-endian? dest-bstr start]) → bytes?
x : real?
size-n : (or/c 4 8)
big-endian? : any/c = (system-big-endian?)
dest-bstr : (and/c bytes? (not/c immutable?)) = (make-bytes size-n)
start : exact-nonnegative-integer? = 0
실수 x를 길이 size-n(4 또는 8이어야 함)의 바이트 문자열에서의 IEEE 표현으로 변환합니다. big-endian?가 참이면 숫자의 최상위 8비트가 결과 바이트 문자열의 첫 번째 바이트에 인코딩되고, 그 외에는 최하위 비트가 첫 번째 문자에 인코딩되는 식입니다.
dest-bstr 인자는 길이 size-n의 가변 바이트 문자열이어야 합니다. n의 인코딩은 바이트 start부터 dest-bstr에 쓰여지고, dest-bstr이 결과로 반환됩니다.
dest-bstr이 제공되었는데 start 더하기 size-n보다 적은 바이트를 가지면 exn:fail:contract 예외가 발생합니다.
procedure
(system-big-endian?) → boolean?
Racket을 실행하는 머신의 숫자 네이티브 인코딩이 빅엔디언이면 #t, 네이티브 인코딩이 리틀엔디언이면 #f를 반환합니다.
추가 상수와 함수(Extra Constants and Functions)
(require racket/math) ; package: base
이 절에서 문서화하는 바인딩은 racket/base가 아니라 racket/math와 racket 라이브러리가 제공합니다.
value
pi : flonum?
원의 둘레와 지름의 비율인 π의 근사치.
예시:
> pi
3.141592653589793
> (cos pi)
-1.0
value
pi.f : (or/c single-flonum? flonum?)
pi와 같은 값이지만, 현재 플랫폼이 지원하면 단정밀도 부동소수점 수입니다.
package base의 7.3.0.5 버전에서 변경: 값이 배정밀도 flonum이 되도록 허용합니다.
procedure
(degrees->radians x) → real?
x : real?
x-도(degree) 각도를 라디안으로 변환합니다.
예시:
> (degrees->radians 180)
3.141592653589793
> (sin (degrees->radians 45))
0.7071067811865475
procedure
(radians->degrees x) → real?
x : real?
x 라디안을 도(degree)로 변환합니다.
예시:
> (radians->degrees pi)
180.0
> (radians->degrees (* 1/4 pi))
45.0
procedure
(sqr z) → number?
z : number?
(* z z)를 반환합니다.
procedure
(sgn x) → (or/c (=/c -1) (=/c 0) (=/c 1) +nan.0 +nan.f)
x : real?
x의 부호를 -1, 0(부정확할 때는 부호 있는 0 변형), 1, 또는 not-a-number로 반환합니다.
예시:
> (sgn 10)
1
> (sgn -10.0)
-1.0
> (sgn 0)
0
> (sgn -0.0)
-0.0
> (sgn 0.0)
0.0
> (sgn +nan.0)
+nan.0
> (sgn +inf.0)
1.0
> (sgn -inf.0)
-1.0
procedure
(conjugate z) → number?
z : number?
z의 켤레 복소수를 반환합니다.
예시:
> (conjugate 1)
1
> (conjugate 3+4i)
3-4i
procedure
(sinh z) → number?
z : number?
z의 쌍곡 사인(hyperbolic sine)을 반환합니다.
procedure
(cosh z) → number?
z : number?
z의 쌍곡 코사인(hyperbolic cosine)을 반환합니다.
procedure
(tanh z) → number?
z : number?
z의 쌍곡 탄젠트(hyperbolic tangent)를 반환합니다.
procedure
(exact-round x) → exact-integer?
x : rational?
(inexact->exact (round x))와 동등합니다.
procedure
(exact-floor x) → exact-integer?
x : rational?
(inexact->exact (floor x))와 동등합니다.
procedure
(exact-ceiling x) → exact-integer?
x : rational?
(inexact->exact (ceiling x))와 동등합니다.
procedure
(exact-truncate x) → exact-integer?
x : rational?
(inexact->exact (truncate x))와 동등합니다.
procedure
(order-of-magnitude r) → (and/c exact? integer?)
r : (and/c real? positive?)
다음을 만족하는 가장 큰 정확한 정수 m을 계산합니다:
(<= (expt 10 m)
(inexact->exact r))
따라서 또한:
(< (inexact->exact r)
(expt 10 (add1 m)))
예시:
> (order-of-magnitude 999)
2
> (order-of-magnitude 1000)
3
> (order-of-magnitude 1/100)
-2
> (order-of-magnitude 1/101)
-3
procedure
(nan? x) → boolean?
x : real?
x가 +nan.0 또는 +nan.f에 eqv?이면 #t, 그 외에는 #f를 반환합니다.
procedure
(infinite? x) → boolean?
x : real?
x가 +inf.0, -inf.0, +inf.f, -inf.f이면 #t, 그 외에는 #f를 반환합니다.
procedure
(positive-integer? x) → boolean?
x : any/c
exact-positive-integer?와 같지만, 양수인 부정확한 정수에도 #t를 반환합니다.
package base의 6.8.0.2 버전에서 추가되었습니다.
procedure
(negative-integer? x) → boolean?
x : any/c
(and (integer? x) (negative? x))와 같습니다.
package base의 6.8.0.2 버전에서 추가되었습니다.
procedure
(nonpositive-integer? x) → boolean?
x : any/c
(and (integer? x) (not (positive? x)))와 같습니다.
package base의 6.8.0.2 버전에서 추가되었습니다.
procedure
(nonnegative-integer? x) → boolean?
x : any/c
exact-nonnegative-integer?와 같지만, 음이 아닌 부정확한 정수에도 #t를 반환합니다.
package base의 6.8.0.2 버전에서 추가되었습니다.
procedure
(natural? x) → boolean?
x : any/c
exact-nonnegative-integer?의 별칭입니다.
package base의 6.8.0.2 버전에서 추가되었습니다.