Модуль 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
См. класс Float для констант, которые влияют на плавающую арифметику в Ruby.
Что здесь есть
Тригонометрические функции
-
::cos: Возвращает косинус заданного аргумента. -
::sin: Возвращает синус заданного аргумента. -
::tan: Возвращает тангенс заданного аргумента.
Обратные тригонометрические функции
-
::acos: Возвращает арккосинус заданного аргумента. -
::asin: Возвращает арксинус заданного аргумента. -
::atan: Возвращает арктангенс заданного аргумента. -
::atan2: Возвращает арктангенс двух заданных аргументов.
Гиперболические тригонометрические функции
-
::cosh: Возвращает гиперболический косинус заданного аргумента. -
::sinh: Возвращает гиперболический синус заданного аргумента. -
::tanh: Возвращает гиперболический тангенс заданного аргумента.
Обратные гиперболические тригонометрические функции
-
::acosh: Возвращает обратный гиперболический косинус заданного аргумента. -
::asinh: Возвращает обратный гиперболический синус заданного аргумента. -
::atanh: Возвращает обратный гиперболический тангенс заданного аргумента.
Функции возведения в степень и логарифмические функции
-
::exp: Возвращает значение заданного значения, возведенного в заданную степень. -
::log: Возвращает логарифм заданного значения по заданному основанию. -
::log10: Возвращает логарифм по основанию 10 заданного аргумента. -
::log2: Возвращает логарифм по основанию 2 заданного аргумента.
Функции дробей и показателей
-
::frexp: Возвращает дробную и показательную части заданного аргумента. -
::ldexp: Возвращает значение для заданной дроби и показателя.
Функции корней
-
::cbrt: Возвращает кубический корень заданного аргумента. -
::sqrt: Возвращает квадратный корень заданного аргумента.
Функции ошибок
-
::erf: Возвращает значение функции Гаусса для заданного аргумента. -
::erfc: Возвращает значение дополнительной функции ошибок для заданного аргумента.
Функции Гамма
-
::gamma: Возвращает значение функции Гамма для заданного аргумента. -
::lgamma: Возвращает значение логарифмической функции Гамма для заданного аргумента.
Функция гипотенузы
-
::hypot: Возвращаетsqrt(a**2 + b**2)для заданныхaиb.
Константы
Публичные методы класса
Исходный код
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 и 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_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)));
} Возвращает косинус 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_cosh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(cosh(Get_Double(x)));
} Возвращает гиперболический косинус x в радианах.
-
Область определения:
[-INFINITY, INFINITY]. -
Область значений:
[1, INFINITY].
Примеры:
cosh(-INFINITY) # => Infinity cosh(0.0) # => 1.0 cosh(INFINITY) # => Infinity
Исходный код
static VALUE
math_erf(VALUE unused_obj, VALUE x)
{
return DBL2NUM(erf(Get_Double(x)));
} Возвращает значение функции Гаусса для x.
-
Область определения:
[-INFINITY, INFINITY]. -
Область значений:
[-1, 1].
Примеры:
erf(-INFINITY) # => -1.0 erf(0.0) # => 0.0 erf(INFINITY) # => 1.0
Связанная функция: Math.erfc.
Исходный код
static VALUE
math_erfc(VALUE unused_obj, VALUE x)
{
return DBL2NUM(erfc(Get_Double(x)));
} Возвращает значение дополнительной функции ошибок для x.
-
Область определения:
[-INFINITY, INFINITY]. -
Область значений:
[0, 2].
Примеры:
erfc(-INFINITY) # => 2.0 erfc(0.0) # => 1.0 erfc(INFINITY) # => 0.0
Связанная функция: Math.erf.
Исходный код
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));
} Возвращает массив из 2 элементов, содержащий нормализованное знаковое число с плавающей точкой fraction и целое число exponent числа x таким образом, что:
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);
} Возвращает логарифм по основанию base логарифм числа x.
-
Область определения:
[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.
-
Область определения:
[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.
-
Область определения:
[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)));
} Возвращает синус 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_sinh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(sinh(Get_Double(x)));
} Возвращает гиперболический синус x в радианах.
-
Область определения:
[-INFINITY, INFINITY]. -
Диапазон значений:
[-INFINITY, INFINITY].
Примеры:
sinh(-INFINITY) # => -Infinity sinh(0.0) # => 0.0 sinh(INFINITY) # => Infinity
Исходный код
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)));
} Возвращает тангенс 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_tanh(VALUE unused_obj, VALUE x)
{
return DBL2NUM(tanh(Get_Double(x)));
} Возвращает гиперболический тангенс x в радианах.
-
Область определения:
[-INFINITY, INFINITY]. -
Область значений:
[-1, 1].
Примеры:
tanh(-INFINITY) # => -1.0 tanh(0.0) # => 0.0 tanh(INFINITY) # => 1.0
Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.