일반 수치 연산(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)를 반환합니다. 그 외에는 zw들로 왼쪽에서 오른쪽으로 쌍으로 나눈 결과를 반환합니다.

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))를 반환하지만, 조합이 quotientremainder를 각각 호출하는 것보다 더 효율적으로 계산될 수 있습니다.

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?

zw의 거듭제곱으로 올린 값을 반환합니다.

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 — 결과는 1
  • w가 0.0 또는 -0.0 — 결과는 1.0
  • w의 실수부가 음수 — 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.0
  • w가 양수 — 결과는 0.0

(expt -0.0 w):

  • w가 음수:
    • w가 홀수 정수 — 결과는 -inf.0
    • w가 그 외의 유리수 — 결과는 +inf.0
  • w가 양수:
    • w가 홀수 정수 — 결과는 -0.0
    • w가 그 외의 유리수 — 결과는 0.0

양수 z에 대한 (expt z -inf.0):

  • z가 1.0보다 작음 — 결과는 +inf.0
  • z가 1.0보다 큼 — 결과는 0.0

양수 z에 대한 (expt z +inf.0):

  • z가 1.0보다 작음 — 결과는 0.0
  • z가 1.0보다 큼 — 결과는 +inf.0

정수 w에 대한 (expt -inf.0 w):

  • w가 음수:
    • w가 홀수 — 결과는 -0.0
    • w가 짝수 — 결과는 0.0
  • w가 양수:
    • w가 홀수 — 결과는 -inf.0
    • w가 짝수 — 결과는 +inf.0

(expt +inf.0 w):

  • w가 음수 — 결과는 0.0
  • w가 양수 — 결과는 +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/flonumfllogb를 사용하는 것을 고려하세요.

예시:

> (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))와 같지만, yx의 부호가 결과의 사분면을 결정합니다. 게다가 yx로 나뉘었을 때 yx+nan.0이 아닌데 +nan.0이 만들어지면 적절한 각도가 반환됩니다. 마지막으로, y가 정확한 0이고 x가 양수이면 결과는 정확한 0입니다. xy가 둘 다 정확한 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의 보수 표현에서 nm번째 비트가 설정되어 있으면 #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이 양수이고 startend가 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이 음이 아니면 정수 nm 비트만큼 왼쪽으로 이동합니다. 즉, 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 범위의 무작위 정확한 정수를 반환합니다.

두 정수 인자 minmax로 호출되면 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

seqn개 요소의 리스트를 무작위로 골라 어떤 순서로든 나열해 반환합니다. 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-modedecimal-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 예외가 발생합니다. (십진 표기로 변환 가능한 어떤 실수도 유리수이므로, 함수 이름에도 불구하고 nrational?여야 합니다.)

예시:

> (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에 인코딩된 머신-형식 숫자를 정확한 정수로 변환합니다. startend 인자는 디코딩할 부분 문자열을 지정하며, (- 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 부동소수점 숫자를 부정확한 실수로 변환합니다. startend의 차이는 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/mathracket 라이브러리가 제공합니다.

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.feqv?이면 #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 버전에서 추가되었습니다.

더 알아보기