module Math
模块 Math 提供了基本三角函数、对数函数和超越函数以及求根的方法。
你可以这样写它的常量和方法调用:
Math::PI # => 3.141592653589793 Math::E # => 2.718281828459045 Math.sin(0.0) # => 0.0 Math.cos(0.0) # => 1.0
如果你包含 module 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 类。
这里有什么
三角函数
反三角函数
双曲三角函数
反双曲三角函数
指数函数和对数函数
-
::exp: 返回给定值 `a` 幂 `x` 的值。 -
::log: 返回给定值 `x` 在给定基数 `base` 下的对数。 -
::log10: 返回给定参数的 10 为底的对数。 -
::log2: 返回给定参数的 2 为底的对数。
分数和指数函数
根函数
误差函数
Gamma 函数
斜边函数
-
::hypot: 返回sqrt(a**2 + b**2),对于给定的a和b。
Constants
Public Class Methods
Source
static VALUE
math_acos(VALUE unused_obj, VALUE x)
{
math_arc(x, acos)
}
返回 x 的 反余弦值。
-
域:
[-1, 1]。 -
值域:
[0, PI]。
示例
acos(-1.0) # => 3.141592653589793 # PI acos(0.0) # => 1.5707963267948966 # PI/2 acos(1.0) # => 0.0
Source
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, INFINITY]。 -
值域:
[0, INFINITY]。
示例
acosh(1.0) # => 0.0 acosh(INFINITY) # => Infinity
Source
static VALUE
math_asin(VALUE unused_obj, VALUE x)
{
math_arc(x, asin)
}
返回 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
Source
static VALUE
math_asinh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(asinh(Get_Double(x)));
}
返回 x 的 反双曲正弦值。
-
域:
[-INFINITY, INFINITY]。 -
值域:
[-INFINITY, INFINITY]。
示例
asinh(-INFINITY) # => -Infinity asinh(0.0) # => 0.0 asinh(INFINITY) # => Infinity
Source
static VALUE
math_atan(VALUE unused_obj, VALUE x)
{
return DBL2NUM(atan(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
Source
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));
}
Source
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 的 反双曲正切值。
-
域:
[-1, 1]。 -
值域:
[-INFINITY, INFINITY]。
示例
atanh(-1.0) # => -Infinity atanh(0.0) # => 0.0 atanh(1.0) # => Infinity
Source
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);
}
返回 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
Source
static VALUE
math_cos(VALUE unused_obj, VALUE x)
{
return DBL2NUM(cos(Get_Double(x)));
}
Source
static VALUE
math_cosh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(cosh(Get_Double(x)));
}
Source
static VALUE
math_erf(VALUE unused_obj, VALUE x)
{
return DBL2NUM(erf(Get_Double(x)));
}
Source
static VALUE
math_erfc(VALUE unused_obj, VALUE x)
{
return DBL2NUM(erfc(Get_Double(x)));
}
Source
static VALUE
math_exp(VALUE unused_obj, VALUE x)
{
return DBL2NUM(exp(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
Source
static VALUE
math_expm1(VALUE unused_obj, VALUE x)
{
return DBL2NUM(expm1(Get_Double(x)));
}
返回 “exp(x) - 1”,即 e 的 x 次幂减 1。
-
域:
[-INFINITY, INFINITY]。 -
值域:
[-1.0, INFINITY]。
示例
expm1(-INFINITY) # => 0.0 expm1(-1.0) # => -0.6321205588285577 # 1.0/E - 1 expm1(0.0) # => 0.0 expm1(0.5) # => 0.6487212707001282 # sqrt(E) - 1 expm1(1.0) # => 1.718281828459045 # E - 1 expm1(2.0) # => 6.38905609893065 # E**2 - 1 expm1(INFINITY) # => Infinity
Source
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 的规范化有符号浮点数 fraction 和整数 exponent 的 2 元素数组,使得:
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 的反函数)。
Source
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));
}
返回 x 的 Gamma 函数值。
-
域:
(-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。
Source
static VALUE
math_hypot(VALUE unused_obj, VALUE x, VALUE y)
{
return DBL2NUM(hypot(Get_Double(x), Get_Double(y)));
}
返回 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。
Source
static VALUE
math_ldexp(VALUE unused_obj, VALUE x, VALUE n)
{
return DBL2NUM(ldexp(Get_Double(x), NUM2INT(n)));
}
返回 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 的反函数)。
Source
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));
}
返回一个 2 元素数组,等效于:
[Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]
参见 对数 Gamma 函数。
-
域:
(-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。
Source
static VALUE
math_log(int argc, const VALUE *argv, VALUE unused_obj)
{
return rb_math_log(argc, argv);
}
返回 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
Source
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 的 10 为底的 对数。
-
域:
[0, INFINITY]。 -
值域:
[-INFINITY, INFINITY]。
示例
log10(0.0) # => -Infinity log10(1.0) # => 0.0 log10(10.0) # => 1.0 log10(INFINITY) # => Infinity
Source
static VALUE
math_log1p(VALUE unused_obj, VALUE x)
{
size_t numbits;
double d = get_double_rshift(x, &numbits);
if (numbits != 0) {
x = rb_big_plus(x, INT2FIX(1));
d = math_log_split(x, &numbits);
/* check for pole error */
if (d == 0.0) return DBL2NUM(-HUGE_VAL);
d = log(d);
d += numbits * M_LN2;
return DBL2NUM(d);
}
domain_check_min(d, -1.0, "log1p");
/* check for pole error */
if (d == -1.0) return DBL2NUM(-HUGE_VAL);
return DBL2NUM(log1p(d)); /* log10(d * 2 ** numbits) */
}
Source
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) */
}
返回 x 的 2 为底的 对数。
-
域:
[0, INFINITY]。 -
值域:
[-INFINITY, INFINITY]。
示例
log2(0.0) # => -Infinity log2(1.0) # => 0.0 log2(2.0) # => 1.0 log2(INFINITY) # => Infinity
Source
static VALUE
math_sin(VALUE unused_obj, VALUE x)
{
return DBL2NUM(sin(Get_Double(x)));
}
Source
static VALUE
math_sinh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(sinh(Get_Double(x)));
}
Source
static VALUE
math_sqrt(VALUE unused_obj, VALUE x)
{
return rb_math_sqrt(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
Source
static VALUE
math_tan(VALUE unused_obj, VALUE x)
{
return DBL2NUM(tan(Get_Double(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
Source
static VALUE
math_tanh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(tanh(Get_Double(x)));
}