Math

Math

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

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

include Math를 하면 더 간단하게 쓸 수 있어요.

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

출처: Ruby 4.0 API

본문

이 문서의 예시들은 다음을 가정해요. include Math, INFINITY = Float::INFINITY.

메서드들의 정의역(domain)과 치역(range)은 열린 구간과 닫힌 구간으로 표기해요. 열린 구간은 끝점을 포함하지 않고, 닫힌 구간은 포함해요.

  • 열린 구간: (-INFINITY, INFINITY)
  • 닫힌 구간: [-1.0, 1.0]
  • 반열린 구간: [1.0, INFINITY)

Math 메서드가 돌려주는 값 중 상당수는 수치적 근사값이에요. 수학적으로 무한 정밀도인 값들이 수치 계산에서는 유한 정밀도로 표현되기 때문이죠. 예를 들어 수학에서 cos(π/2)는 정확히 0이지만, 계산에서는 0에 아주 가까운 값이 돼요.

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

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

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

Constants

E

오일러 수(e)의 수학 상수 EFloat로 정의한 값이에요. Math::E로 접근해요.

PI

원주율 PIFloat로 정의한 값이에요. Math::PI로 접근해요.

Module Functions

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].

asinh(0.0)      # => 0.0
asinh(INFINITY) # => Infinity
atan(x) → Float

x의 아크탄젠트(역탄젠트)를 돌려줘요. 정의역 [-INFINITY, INFINITY], 치역 [-PI/2, PI/2].

atan(0.0)      # => 0.0
atan(PI/2)     # => 1.0038848218538872
atan(INFINITY) # => 1.5707963267948966   # PI/2
atan2(y, x) → float

yx의 아크탄젠트(라디안)를 돌려줘요. 이 방식은 두 인자의 부호를 모두 고려해 사분면이 정확한 각을 돌려줘요. 정의역은 y, 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]. 음수도 세제곱근을 구할 수 있어요.

cbrt(-27.0) # => -3.0
cbrt(-8.0)  # => -2.0
cbrt(0.0)   # => 0.0
cbrt(8.0)   # => 2.0
cbrt(27.0)  # => 3.0
cos(x) → float

x(라디안)의 코사인을 돌려줘요. 정의역 (-INFINITY, INFINITY), 치역 [-1.0, 1.0].

cos(0.0)  # => 1.0
cos(PI)   # => -1.0
cos(PI/2) # => 6.123031769111886e-17  # 0.0000000000000001
cosh(x) → float

x의 쌍곡코사인을 돌려줘요. 정의역 [-INFINITY, INFINITY], 치역 [1, INFINITY].

cosh(0.0)      # => 1.0
cosh(INFINITY) # => Infinity
erf(x) → float

x에 대한 가우스 오차 함수(gauss error function)의 값을 돌려줘요. 정의역 [-INFINITY, INFINITY], 치역 [-1, 1].

erf(-INFINITY) # => -1.0
erf(0.0)       # => 0.0
erf(INFINITY)  # => 1.0

관련: Math.erfc.

erfc(x) → Float

x에 대한 여오차 함수(complementary error function)의 값을 돌려줘요. 정의역 [-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(0.0)      # => 1.0
exp(1.0)      # => 2.718281828459045  # E
exp(2.0)      # => 7.38905609893065   # E**2
exp(INFINITY) # => Infinity
expm1(x) → float

exp(x) - 1, 즉 ex제곱에서 1을 뺀 값을 돌려줘요. 정의역 [-INFINITY, INFINITY], 치역 [-1.0, INFINITY].

expm1(0.0)      # => 0.0
expm1(1.0)      # => 1.718281828459045  # E - 1
expm1(INFINITY) # => Infinity
frexp(x) → [fraction, exponent]

x를 다음이 성립하도록 정규화된 부호 있는 fraction(float)과 정수 exponent(지수)의 2-요소 배열로 돌려줘요.

x = fraction * 2**exponent

IEEE 754 배정밀도 2진 부동소수점 형식(binary64)을 참고하세요. 정의역·치역 모두 [-INFINITY, INFINITY].

frexp(1.0) # => [0.5, 1]
frexp(2.0) # => [0.5, 2]

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

gamma(x) → float

x에 대한 감마 함수의 값을 돌려줘요. 정의역은 음의 정수를 제외한 (-INFINITY, 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, b 모두 [-INFINITY, INFINITY], 치역 [0, INFINITY].

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와 동등).

ldexp(-0.5, 2) # => -2.0
ldexp(0.0, 0)  # => 0.0
ldexp(0.5, 2)  # => 2.0

관련: 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], 둘째 요소는 -1 또는 1이에요.

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

관련: Math.gamma.

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

xbase를 밑으로 하는 로그를 돌려줘요. base를 생략하면 자연로그(밑 E)예요. 정의역 [0, INFINITY].

log(0.0)     # => -Infinity
log(1.0)     # => 0.0
log(E)       # => 1.0
log(INFINITY)# => Infinity

log(2.0, 2.0)   # => 1.0
log(10.0, 10.0) # => 1.0
log10(x) → float

x의 상용로그(밑 10)를 돌려줘요. 정의역 [0, INFINITY].

log10(1.0)      # => 0.0
log10(10.0)     # => 1.0
log10(INFINITY) # => Infinity
log1p(x) → float

log(x + 1), 즉 (x + 1)의 밑 E 로그를 돌려줘요. 정의역 [-1, INFINITY].

log1p(-1.0)     # => -Infinity
log1p(0.0)      # => 0.0
log1p(E - 1)    # => 1.0
log2(x) → float

x의 밑 2 로그를 돌려줘요. 정의역 [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/2) # => -1.0
sin(0.0)   # => 0.0
sin(PI/2)  # => 1.0
sinh(x) → float

x의 쌍곡사인을 돌려줘요. 정의역·치역 모두 [-INFINITY, INFINITY].

sinh(0.0)      # => 0.0
sinh(INFINITY) # => Infinity
sqrt(x) → float

x의 주(非음수) 제곱근을 돌려줘요. 정의역·치역 모두 [0, INFINITY].

sqrt(0.0)      # => 0.0
sqrt(1.0)      # => 1.0
sqrt(2.0)      # => 1.4142135623730951
sqrt(4.0)      # => 2.0
tan(x) → float

x(라디안)의 탄젠트를 돌려줘요. 정의역·치역 모두 (-INFINITY, INFINITY).

tan(0.0)  # => 0.0
tan(PI/2) # => 1.633123935319537e+16  # 16331239353195370.0
tanh(x) → float

x의 쌍곡탄젠트를 돌려줘요. 정의역 [-INFINITY, INFINITY], 치역 [-1, 1].

tanh(-INFINITY) # => -1.0
tanh(0.0)       # => 0.0
tanh(INFINITY)  # => 1.0