Math

Math

기본적인 삼각 함수, 로그 함수, 초월 함수, 그리고 거듭제곱근을 구하는 메서드들을 제공하는 모듈이에요.

출처: Ruby 3.3 API

본문

상수와 메서드 호출은 이렇게 쓸 수 있어요.

Math::PI      # => 3.141592653589793
Math::E       # => 2.718281828459045
Math.sin(0.0) # => 0.0
Math.cos(0.0) # => 1.0

Math 모듈을 include하면 더 간단한 형태로 쓸 수 있어요.

include Math
PI       # => 3.141592653589793
E        # => 2.718281828459045
sin(0.0) # => 0.0
cos(0.0) # => 1.0

여기서의 예시들은 단순함을 위해 다음을 가정해요.

include Math
INFINITY = Float::INFINITY

메서드들의 정의역(domain)과 치역(range)은 열린 구간이나 닫힌 구간으로 표기돼요. 각각 괄호거나 대괄호죠.

  • 열린 구간(open interval)은 끝점을 포함하지 않아요.
(-INFINITY, INFINITY)
  • 닫힌 구간(closed interval)은 끝점을 포함해요.
[-1.0, 1.0]
  • 반 열린 구간(half-open interval)은 한 끝점은 포함하고 다른 끝점은 포함하지 않아요.
[1.0, INFINITY)

Math 메서드가 돌려주는 많은 값은 수치적 근삿값이에요. 그런 값들은 수학적으로는 무한한 정밀도를 가지지만, 수치 계산에서는 정밀도가 유한하기 때문이죠.

그래서 수학에서 *cos(π/2)*는 정확히 0이지만, 우리 계산에서 cos(PI/2)는 0에 아주 가까운 수예요.

cos(PI/2) # => 6.123031769111886e-17

매우 크거나 작은 반환 값에는 명확성을 위해 포맷된 숫자를 함께 달아 뒀어요.

tan(PI/2)  # => 1.633123935319537e+16   # 16331239353195370.0
tan(PI)    # => -1.2246467991473532e-16 # -0.0000000000000001

Ruby의 부동소수점 연산에 영향을 주는 상수들은 Float 클래스를 보세요.

여기에 있는 것들 (What's Here)

삼각 함수 (Trigonometric Functions)

  • ::cos: 주어진 인자의 코사인을 돌려줘요.
  • ::sin: 주어진 인자의 사인을 돌려줘요.
  • ::tan: 주어진 인자의 탄젠트를 돌려줘요.

역삼각 함수 (Inverse Trigonometric Functions)

  • ::acos: 주어진 인자의 아크코사인을 돌려줘요.
  • ::asin: 주어진 인자의 아크사인을 돌려줘요.
  • ::atan: 주어진 인자의 아크탄젠트를 돌려줘요.
  • ::atan2: 주어진 두 인자의 아크탄젠트를 돌려줘요.

쌍곡 삼각 함수 (Hyperbolic Trigonometric Functions)

  • ::cosh: 주어진 인자의 쌍곡코사인을 돌려줘요.
  • ::sinh: 주어진 인자의 쌍곡사인을 돌려줘요.
  • ::tanh: 주어진 인자의 쌍곡탄젠트를 돌려줘요.

역쌍곡 삼각 함수 (Inverse Hyperbolic Trigonometric Functions)

  • ::acosh: 주어진 인자의 역쌍곡코사인을 돌려줘요.
  • ::asinh: 주어진 인자의 역쌍곡사인을 돌려줘요.
  • ::atanh: 주어진 인자의 역쌍곡탄젠트를 돌려줘요.

지수 및 로그 함수 (Exponentiation and Logarithmic Functions)

  • ::exp: 주어진 값을 주어진 거듭제곱으로 올린 값을 돌려줘요.
  • ::log: 주어진 값의 주어진 밑(base) 로그를 돌려줘요.
  • ::log10: 주어진 인자의 밑 10 로그를 돌려줘요.
  • ::log2: 주어진 인자의 밑 2 로그를 돌려줘요.

분수 및 지수 함수 (Fraction and Exponent Functions)

  • ::frexp: 주어진 인자의 분수와 지수를 돌려줘요.
  • ::ldexp: 주어진 분수와 지수에 대한 값을 돌려줘요.

거듭제곱근 함수 (Root Functions)

  • ::cbrt: 주어진 인자의 세제곱근을 돌려줘요.
  • ::sqrt: 주어진 인자의 제곱근을 돌려줘요.

오차 함수 (Error Functions)

  • ::erf: 주어진 인자에 대한 가우스 오차 함수 값을 돌려줘요.
  • ::erfc: 주어진 인자에 대한 상보 오차 함수 값을 돌려줘요.

감마 함수 (Gamma Functions)

  • ::gamma: 주어진 인자에 대한 감마 함수 값을 돌려줘요.
  • ::lgamma: 주어진 인자에 대한 로그 감마 함수 값을 돌려줘요.

빗변 함수 (Hypotenuse Function)

  • ::hypot: 주어진 ab에 대해 sqrt(a**2 + b**2)을 돌려줘요.

Constants

E

오일러 수(e)의 수학 상수 EFloat 숫자로 정의한 값이에요.

PI

수학 상수 PIFloat 숫자로 정의한 값이에요.

Public Class Methods

acos(x) → float

x의 아크코사인을 돌려줘요.

  • 정의역: [-1, 1]
  • 치역: [0, PI]
acos(-1.0) # => 3.141592653589793  # PI
acos(0.0)  # => 1.5707963267948966 # PI/2
acos(1.0)  # => 0.0

acosh(x) → float

x의 역쌍곡코사인을 돌려줘요.

  • 정의역: [1, INFINITY]
  • 치역: [0, INFINITY]
acosh(1.0)      # => 0.0
acosh(INFINITY) # => Infinity

asin(x) → float

x의 아크사인을 돌려줘요.

  • 정의역: [-1, 1]
  • 치역: [-PI/2, PI/2]
asin(-1.0) # => -1.5707963267948966 # -PI/2
asin(0.0)  # => 0.0
asin(1.0)  # => 1.5707963267948966  # PI/2

asinh(x) → float

x의 역쌍곡사인을 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-INFINITY, INFINITY]
asinh(-INFINITY) # => -Infinity
asinh(0.0)       # => 0.0
asinh(INFINITY)  # => Infinity

atan(x) → Float

x의 아크탄젠트를 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-PI/2, PI/2]
atan(-INFINITY) # => -1.5707963267948966 # -PI2
atan(-PI)       # => -1.2626272556789115
atan(-PI/2)     # => -1.0038848218538872
atan(0.0)       # => 0.0
atan(PI/2)      # => 1.0038848218538872
atan(PI)        # => 1.2626272556789115
atan(INFINITY)  # => 1.5707963267948966  # PI/2

atan2(y, x) → float

yx의 아크탄젠트를 라디안으로 돌려줘요.

  • y의 정의역: [-INFINITY, INFINITY]
  • x의 정의역: [-INFINITY, INFINITY]
  • 치역: [-PI, PI]
atan2(-1.0, -1.0) # => -2.356194490192345  # -3*PI/4
atan2(-1.0, 0.0)  # => -1.5707963267948966 # -PI/2
atan2(-1.0, 1.0)  # => -0.7853981633974483 # -PI/4
atan2(0.0, -1.0)  # => 3.141592653589793   # PI

atanh(x) → float

x의 역쌍곡탄젠트를 돌려줘요.

  • 정의역: [-1, 1]
  • 치역: [-INFINITY, INFINITY]
atanh(-1.0) # => -Infinity
atanh(0.0)  # => 0.0
atanh(1.0)  # => Infinity

cbrt(x) → float

x의 세제곱근을 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-INFINITY, INFINITY]
cbrt(-INFINITY) # => -Infinity
cbrt(-27.0)     # => -3.0
cbrt(-8.0)      # => -2.0
cbrt(-2.0)      # => -1.2599210498948732
cbrt(1.0)       # => 1.0
cbrt(0.0)       # => 0.0
cbrt(2.0)       # => 1.2599210498948732
cbrt(8.0)       # => 2.0
cbrt(27.0)      # => 3.0
cbrt(INFINITY)  # => Infinity

cos(x) → float

x의 코사인을 라디안으로 돌려줘요.

  • 정의역: (-INFINITY, INFINITY)
  • 치역: [-1.0, 1.0]
cos(-PI)   # => -1.0
cos(-PI/2) # => 6.123031769111886e-17 # 0.0000000000000001
cos(0.0)   # => 1.0
cos(PI/2)  # => 6.123031769111886e-17 # 0.0000000000000001
cos(PI)    # => -1.0

cosh(x) → float

x의 쌍곡코사인을 라디안으로 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [1, INFINITY]
cosh(-INFINITY) # => Infinity
cosh(0.0)       # => 1.0
cosh(INFINITY)  # => Infinity

erf(x) → float

x에 대한 가우스 오차 함수 값을 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-1, 1]
erf(-INFINITY) # => -1.0
erf(0.0)       # => 0.0
erf(INFINITY)  # => 1.0

관련: Math.erfc.

erfc(x) → Float

x에 대한 상보 오차 함수 값을 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [0, 2]
erfc(-INFINITY) # => 2.0
erfc(0.0)       # => 1.0
erfc(INFINITY)  # => 0.0

관련: Math.erf.

exp(x) → float

ex 거듭제곱한 값을 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [0, INFINITY]
exp(-INFINITY) # => 0.0
exp(-1.0)      # => 0.36787944117144233 # 1.0/E
exp(0.0)       # => 1.0
exp(0.5)       # => 1.6487212707001282  # sqrt(E)
exp(1.0)       # => 2.718281828459045   # E
exp(2.0)       # => 7.38905609893065    # E**2
exp(INFINITY)  # => Infinity

frexp(x) → [fraction, exponent]

x의 정규화된 signed float fraction과 정수 exponent를 담은 2-요소 배열을 돌려줘요. 다음이 성립해요.

x = fraction * 2**exponent

IEEE 754 배정도(double-precision) 이진 부동소수점 형식(binary64)을 참고하세요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-INFINITY, INFINITY]
frexp(-INFINITY) # => [-Infinity, -1]
frexp(-2.0)      # => [-0.5, 2]
frexp(-1.0)      # => [-0.5, 1]
frexp(0.0)       # => [0.0, 0]
frexp(1.0)       # => [0.5, 1]
frexp(2.0)       # => [0.5, 2]
frexp(INFINITY)  # => [Infinity, -1]

관련: Math.ldexp (Math.frexp의 역).

gamma(x) → float

x에 대한 감마 함수 값을 돌려줘요.

  • 정의역: (-INFINITY, INFINITY]에서 음의 정수는 제외
  • 치역: [-INFINITY, INFINITY]
gamma(-2.5)      # => -0.9453087204829431
gamma(-1.5)      # => 2.3632718012073513
gamma(-0.5)      # => -3.5449077018110375
gamma(0.0)      # => Infinity
gamma(1.0)      # => 1.0
gamma(2.0)      # => 1.0
gamma(3.0)      # => 2.0
gamma(4.0)      # => 6.0
gamma(5.0)      # => 24.0

관련: Math.lgamma.

hypot(a, b) → float

sqrt(a**2 + b**2)을 돌려줘요. 이 값은 다른 두 변의 길이가 각각 a, b인 직각삼각형의 가장 긴 변 c(빗변)의 길이예요.

  • a의 정의역: [-INFINITY, INFINITY]
  • b의 정의역: [-INFINITY, INFINITY]
  • 치역: [0, INFINITY]
hypot(0.0, 1.0)       # => 1.0
hypot(1.0, 1.0)       # => 1.4142135623730951 # sqrt(2.0)
hypot(3.0, 4.0)       # => 5.0
hypot(5.0, 12.0)      # => 13.0
hypot(1.0, sqrt(3.0)) # => 1.9999999999999998 # Near 2.0

두 인자 중 하나라도 INFINITY-INFINITY라면 결과는 Infinity예요.

ldexp(fraction, exponent) → float

fraction * 2**exponent의 값을 돌려줘요.

  • fraction의 정의역: [0.0, 1.0)
  • exponent의 정의역: [0, 1024] (더 큰 값은 1024와 동등)

IEEE 754 배정도 이진 부동소수점 형식(binary64)을 참고하세요.

ldexp(-INFINITY, -1) # => -Infinity
ldexp(-0.5, 2)       # => -2.0
ldexp(-0.5, 1)       # => -1.0
ldexp(0.0, 0)        # => 0.0
ldexp(-0.5, 1)       # => 1.0
ldexp(-0.5, 2)       # => 2.0
ldexp(INFINITY, -1)  # => Infinity

관련: Math.frexp (Math.ldexp의 역).

lgamma(x) → [float, -1 or 1]

다음과 같은 2-요소 배열을 돌려줘요.

[Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]

로그 감마 함수를 참고하세요.

  • 정의역: (-INFINITY, INFINITY]
  • 첫 요소의 치역: (-INFINITY, INFINITY]
  • 두 번째 요소는 -1 또는 1이에요.
lgamma(-4.0) # => [Infinity, -1]
lgamma(-3.0) # => [Infinity, -1]
lgamma(-2.0) # => [Infinity, -1]
lgamma(-1.0) # => [Infinity, -1]
lgamma(0.0)  # => [Infinity, 1]

lgamma(1.0)  # => [0.0, 1]
lgamma(2.0)  # => [0.0, 1]
lgamma(3.0)  # => [0.6931471805599436, 1]
lgamma(4.0)  # => [1.7917594692280545, 1]

lgamma(-2.5) # => [-0.05624371649767279, -1]
lgamma(-1.5) # => [0.8600470153764797, 1]
lgamma(-0.5) # => [1.265512123484647, -1]
lgamma(0.5)  # => [0.5723649429247004, 1]
lgamma(1.5)  # => [-0.12078223763524676, 1]
lgamma(2.5)  # => [0.2846828704729205, 1]

관련: Math.gamma.

log(x, base = Math::E) → Float

xbase 밑 로그를 돌려줘요.

  • 정의역: [0, INFINITY]
  • 치역: [-INFINITY, INFINITY]
log(0.0)        # => -Infinity
log(1.0)        # => 0.0
log(E)          # => 1.0
log(INFINITY)   # => Infinity

log(0.0, 2.0)   # => -Infinity
log(1.0, 2.0)   # => 0.0
log(2.0, 2.0)   # => 1.0

log(0.0, 10.0)  # => -Infinity
log(1.0, 10.0)  # => 0.0
log(10.0, 10.0) # => 1.0

log10(x) → float

x의 밑 10 로그를 돌려줘요.

  • 정의역: [0, INFINITY]
  • 치역: [-INFINITY, INFINITY]
log10(0.0)      # => -Infinity
log10(1.0)      # => 0.0
log10(10.0)     # => 1.0
log10(INFINITY) # => Infinity

log2(x) → float

x의 밑 2 로그를 돌려줘요.

  • 정의역: [0, INFINITY]
  • 치역: [-INFINITY, INFINITY]
log2(0.0)      # => -Infinity
log2(1.0)      # => 0.0
log2(2.0)      # => 1.0
log2(INFINITY) # => Infinity

sin(x) → float

x의 사인을 라디안으로 돌려줘요.

  • 정의역: (-INFINITY, INFINITY)
  • 치역: [-1.0, 1.0]
sin(-PI)   # => -1.2246063538223773e-16 # -0.0000000000000001
sin(-PI/2) # => -1.0
sin(0.0)   # => 0.0
sin(PI/2)  # => 1.0
sin(PI)    # => 1.2246063538223773e-16  # 0.0000000000000001

sinh(x) → float

x의 쌍곡사인을 라디안으로 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-INFINITY, INFINITY]
sinh(-INFINITY) # => -Infinity
sinh(0.0)       # => 0.0
sinh(INFINITY)  # => Infinity

sqrt(x) → float

x의 주(principal, 음이 아닌) 제곱근을 돌려줘요.

  • 정의역: [0, INFINITY]
  • 치역: [0, INFINITY]
sqrt(0.0)      # => 0.0
sqrt(0.5)      # => 0.7071067811865476
sqrt(1.0)      # => 1.0
sqrt(2.0)      # => 1.4142135623730951
sqrt(4.0)      # => 2.0
sqrt(9.0)      # => 3.0
sqrt(INFINITY) # => Infinity

tan(x) → float

x의 탄젠트를 라디안으로 돌려줘요.

  • 정의역: (-INFINITY, INFINITY)
  • 치역: (-INFINITY, INFINITY)
tan(-PI)   # => 1.2246467991473532e-16  # -0.0000000000000001
tan(-PI/2) # => -1.633123935319537e+16  # -16331239353195370.0
tan(0.0)   # => 0.0
tan(PI/2)  # => 1.633123935319537e+16   # 16331239353195370.0
tan(PI)    # => -1.2246467991473532e-16 # -0.0000000000000001

tanh(x) → float

x의 쌍곡탄젠트를 라디안으로 돌려줘요.

  • 정의역: [-INFINITY, INFINITY]
  • 치역: [-1, 1]
tanh(-INFINITY) # => -1.0
tanh(0.0)       # => 0.0
tanh(INFINITY)  # => 1.0

더 알아보기

  • Ruby의 부동소수점 연산과 관련 상수는 Float 문서를 보세요.
  • Integer#pow, BigDecimal과 같은 다른 수치 계산 도구도 함께 살펴볼 수 있어요.