模块 Math
模块 Math 提供了基本三角函数、对数函数和超越函数以及开根的方法。
您可以这样编写它的常量和方法调用
Math::PI # => 3.141592653589793 Math::E # => 2.718281828459045 Math.sin(0.0) # => 0.0 Math.cos(0.0) # => 1.0
如果您包含模块 Math,您可以编写更简单的形式
include Math PI # => 3.141592653589793 E # => 2.718281828459045 sin(0.0) # => 0.0 cos(0.0) # => 1.0
为了简单起见,这里示例假设
include Math INFINITY = Float::INFINITY
方法的域和范围用开区间或闭区间表示,分别使用括号或方括号
-
开区间不包括端点
(-INFINITY, INFINITY)
-
闭区间包括端点
[-1.0, 1.0]
-
半开区间包括一个端点,但不包括另一个端点
[1.0, INFINITY)
Math 方法返回的许多值都是数值近似值。这是因为在数学中,许多这样的值具有无限精度,而在数值计算中,精度是有限的。
因此,在数学中,cos(π/2) 恰好为零,但在我们的计算中,cos(PI/2)
是一个非常接近零的数字
cos(PI/2) # => 6.123031769111886e-17
对于非常大和非常小的返回值,我们添加了格式化的数字以提高清晰度
tan(PI/2) # => 1.633123935319537e+16 # 16331239353195370.0 tan(PI) # => -1.2246467991473532e-16 # -0.0000000000000001
有关影响 Ruby 浮点运算的常量,请参见类 Float
。
内容¶ ↑
三角函数¶ ↑
反三角函数¶ ↑
双曲三角函数¶ ↑
反双曲三角函数¶ ↑
指数和对数函数¶ ↑
分数和指数函数¶ ↑
根函数¶ ↑
误差函数¶ ↑
伽马函数¶ ↑
斜边函数¶ ↑
-
::hypot
: 返回给定a
和b
的sqrt(a**2 + b**2)
。
常量
公共类方法
返回 x
的 反余弦。
-
域:
[-1, 1]
。 -
范围:
[0, PI]
。
示例
acos(-1.0) # => 3.141592653589793 # PI acos(0.0) # => 1.5707963267948966 # PI/2 acos(1.0) # => 0.0
static VALUE math_acos(VALUE unused_obj, VALUE x) { math_arc(x, acos) }
返回 x
的 反双曲余弦。
-
域:
[1, INFINITY]
。 -
范围:
[0, INFINITY]
。
示例
acosh(1.0) # => 0.0 acosh(INFINITY) # => Infinity
static VALUE math_acosh(VALUE unused_obj, VALUE x) { double d; d = Get_Double(x); domain_check_min(d, 1.0, "acosh"); return DBL2NUM(acosh(d)); }
返回 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
static VALUE math_asin(VALUE unused_obj, VALUE x) { math_arc(x, asin) }
返回 x
的 反双曲正弦。
-
域:
[-INFINITY, INFINITY]
。 -
范围:
[-INFINITY, INFINITY]
。
示例
asinh(-INFINITY) # => -Infinity asinh(0.0) # => 0.0 asinh(INFINITY) # => Infinity
static VALUE math_asinh(VALUE unused_obj, VALUE x) { return DBL2NUM(asinh(Get_Double(x))); }
返回 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
static VALUE math_atan(VALUE unused_obj, VALUE x) { return DBL2NUM(atan(Get_Double(x))); }
-
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
static VALUE math_atan2(VALUE unused_obj, VALUE y, VALUE x) { double dx, dy; dx = Get_Double(x); dy = Get_Double(y); if (dx == 0.0 && dy == 0.0) { if (!signbit(dx)) return DBL2NUM(dy); if (!signbit(dy)) return DBL2NUM(M_PI); return DBL2NUM(-M_PI); } #ifndef ATAN2_INF_C99 if (isinf(dx) && isinf(dy)) { /* optimization for FLONUM */ if (dx < 0.0) { const double dz = (3.0 * M_PI / 4.0); return (dy < 0.0) ? DBL2NUM(-dz) : DBL2NUM(dz); } else { const double dz = (M_PI / 4.0); return (dy < 0.0) ? DBL2NUM(-dz) : DBL2NUM(dz); } } #endif return DBL2NUM(atan2(dy, dx)); }
返回 x
的 反双曲正切。
-
域:
[-1, 1]
。 -
范围:
[-INFINITY, INFINITY]
。
示例
atanh(-1.0) # => -Infinity atanh(0.0) # => 0.0 atanh(1.0) # => Infinity
static VALUE math_atanh(VALUE unused_obj, VALUE x) { double d; d = Get_Double(x); domain_check_range(d, -1.0, +1.0, "atanh"); /* check for pole error */ if (d == -1.0) return DBL2NUM(-HUGE_VAL); if (d == +1.0) return DBL2NUM(+HUGE_VAL); return DBL2NUM(atanh(d)); }
返回 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(1.0) # => 1.0 cbrt(2.0) # => 1.2599210498948732 cbrt(8.0) # => 2.0 cbrt(27.0) # => 3.0 cbrt(INFINITY) # => Infinity
static VALUE math_cbrt(VALUE unused_obj, VALUE x) { double f = Get_Double(x); double r = cbrt(f); #if defined __GLIBC__ if (isfinite(r) && !(f == 0.0 && r == 0.0)) { r = (2.0 * r + (f / r / r)) / 3.0; } #endif return DBL2NUM(r); }
-
定义域:
(-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
static VALUE math_cos(VALUE unused_obj, VALUE x) { return DBL2NUM(cos(Get_Double(x))); }
返回 e
的 x
次方。
-
域:
[-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
static VALUE math_exp(VALUE unused_obj, VALUE x) { return DBL2NUM(exp(Get_Double(x))); }
返回一个包含两个元素的数组,分别为 x
的归一化带符号浮点数 fraction
和整数 exponent
,使得
x = fraction * 2**exponent
参见 IEEE 754 双精度二进制浮点数格式:binary64。
-
域:
[-INFINITY, INFINITY]
。 -
Range
[-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
的逆运算)。
static VALUE math_frexp(VALUE unused_obj, VALUE x) { double d; int exp; d = frexp(Get_Double(x), &exp); return rb_assoc_new(DBL2NUM(d), INT2NUM(exp)); }
返回 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
。
static VALUE math_gamma(VALUE unused_obj, VALUE x) { static const double fact_table[] = { /* fact(0) */ 1.0, /* fact(1) */ 1.0, /* fact(2) */ 2.0, /* fact(3) */ 6.0, /* fact(4) */ 24.0, /* fact(5) */ 120.0, /* fact(6) */ 720.0, /* fact(7) */ 5040.0, /* fact(8) */ 40320.0, /* fact(9) */ 362880.0, /* fact(10) */ 3628800.0, /* fact(11) */ 39916800.0, /* fact(12) */ 479001600.0, /* fact(13) */ 6227020800.0, /* fact(14) */ 87178291200.0, /* fact(15) */ 1307674368000.0, /* fact(16) */ 20922789888000.0, /* fact(17) */ 355687428096000.0, /* fact(18) */ 6402373705728000.0, /* fact(19) */ 121645100408832000.0, /* fact(20) */ 2432902008176640000.0, /* fact(21) */ 51090942171709440000.0, /* fact(22) */ 1124000727777607680000.0, /* fact(23)=25852016738884976640000 needs 56bit mantissa which is * impossible to represent exactly in IEEE 754 double which have * 53bit mantissa. */ }; enum {NFACT_TABLE = numberof(fact_table)}; double d; d = Get_Double(x); /* check for domain error */ if (isinf(d)) { if (signbit(d)) domain_error("gamma"); return DBL2NUM(HUGE_VAL); } if (d == 0.0) { return signbit(d) ? DBL2NUM(-HUGE_VAL) : DBL2NUM(HUGE_VAL); } if (d == floor(d)) { domain_check_min(d, 0.0, "gamma"); if (1.0 <= d && d <= (double)NFACT_TABLE) { return DBL2NUM(fact_table[(int)d - 1]); } } return DBL2NUM(tgamma(d)); }
返回sqrt(a**2 + b**2)
,即直角三角形斜边c
(最长边)的长度,该三角形的另外两条边长度分别为a
和b
。
-
a
的域:[-INFINITY, INFINITY]
。 -
+ab
的域:[-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
。
static VALUE math_hypot(VALUE unused_obj, VALUE x, VALUE y) { return DBL2NUM(hypot(Get_Double(x), Get_Double(y))); }
返回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
的逆运算)。
static VALUE math_ldexp(VALUE unused_obj, VALUE x, VALUE n) { return DBL2NUM(ldexp(Get_Double(x), NUM2INT(n))); }
返回一个等效于以下内容的2元素数组:
[Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]
参见对数伽马函数。
-
域:
(-INFINITY, INFINITY]
。 -
Range
的第一个元素:(-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
。
static VALUE math_lgamma(VALUE unused_obj, VALUE x) { double d; int sign=1; VALUE v; d = Get_Double(x); /* check for domain error */ if (isinf(d)) { if (signbit(d)) domain_error("lgamma"); return rb_assoc_new(DBL2NUM(HUGE_VAL), INT2FIX(1)); } if (d == 0.0) { VALUE vsign = signbit(d) ? INT2FIX(-1) : INT2FIX(+1); return rb_assoc_new(DBL2NUM(HUGE_VAL), vsign); } v = DBL2NUM(lgamma_r(d, &sign)); return rb_assoc_new(v, INT2FIX(sign)); }
返回x
的以base
为底的对数。
-
域:
[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
static VALUE math_log(int argc, const VALUE *argv, VALUE unused_obj) { return rb_math_log(argc, argv); }
返回x
的以10为底的对数。
-
域:
[0, INFINITY]
。 -
范围:
[-INFINITY, INFINITY]
。
示例
log10(0.0) # => -Infinity log10(1.0) # => 0.0 log10(10.0) # => 1.0 log10(INFINITY) # => Infinity
static VALUE math_log10(VALUE unused_obj, VALUE x) { size_t numbits; double d = get_double_rshift(x, &numbits); domain_check_min(d, 0.0, "log10"); /* check for pole error */ if (d == 0.0) return DBL2NUM(-HUGE_VAL); return DBL2NUM(log10(d) + numbits * log10(2)); /* log10(d * 2 ** numbits) */ }
返回x
的以2为底的对数。
-
域:
[0, INFINITY]
。 -
范围:
[-INFINITY, INFINITY]
。
示例
log2(0.0) # => -Infinity log2(1.0) # => 0.0 log2(2.0) # => 1.0 log2(INFINITY) # => Infinity
static VALUE math_log2(VALUE unused_obj, VALUE x) { size_t numbits; double d = get_double_rshift(x, &numbits); domain_check_min(d, 0.0, "log2"); /* check for pole error */ if (d == 0.0) return DBL2NUM(-HUGE_VAL); return DBL2NUM(log2(d) + numbits); /* log2(d * 2 ** numbits) */ }
-
定义域:
(-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
static VALUE math_sin(VALUE unused_obj, VALUE x) { return DBL2NUM(sin(Get_Double(x))); }
返回 x
的主(非负)平方根。
-
域:
[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
static VALUE math_sqrt(VALUE unused_obj, VALUE x) { return rb_math_sqrt(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
static VALUE math_tan(VALUE unused_obj, VALUE x) { return DBL2NUM(tan(Get_Double(x))); }