模块 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)。
常量
公共类方法
源代码
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
源代码
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
源代码
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
源代码
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
源代码
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
源代码
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));
}
-
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_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
源代码
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
源代码
static VALUE
math_cos(VALUE unused_obj, VALUE x)
{
return DBL2NUM(cos(Get_Double(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
源代码
源代码
源代码
源代码
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
源代码
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 的逆运算)。
源代码
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 的伽玛函数值。
-
定义域:
(-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_hypot(VALUE unused_obj, VALUE x, VALUE y)
{
return DBL2NUM(hypot(Get_Double(x), Get_Double(y)));
}
返回 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_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 的逆运算)。
源代码
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]
请参阅对数伽玛函数。
-
定义域:
(-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_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
源代码
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
源代码
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
源代码
static VALUE
math_sin(VALUE unused_obj, VALUE x)
{
return DBL2NUM(sin(Get_Double(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
源代码
源代码
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
源代码
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