Module: Math

Defined in:
math.c

Defined Under Namespace

Classes: DomainError

Constant Summary collapse

PI =

Definition of the mathematical constant PI as a Float number.

DBL2NUM(M_PI)
E =

Definition of the mathematical constant E for Euler’s number (e) as a Float number.

DBL2NUM(exp(1.0))

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.acos(x) ⇒ Float

Returns the arc cosine of x.

  • Domain: [-1, 1].

  • Range: [0, PI].

Examples:

acos(-1.0) # => 3.141592653589793  # PI
acos(0.0)  # => 1.5707963267948966 # PI/2
acos(1.0)  # => 0.0

Returns:


196
197
198
199
200
# File 'math.c', line 196

static VALUE
math_acos(VALUE unused_obj, VALUE x)
{
    math_arc(x, acos)
}

.acosh(x) ⇒ Float

Returns the inverse hyperbolic cosine of x.

  • Domain: [1, INFINITY].

  • Range: [0, INFINITY].

Examples:

acosh(1.0)      # => 0.0
acosh(INFINITY) # => Infinity

Returns:


371
372
373
374
375
376
377
378
379
# File 'math.c', line 371

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));
}

.asin(x) ⇒ Float

Returns the arc sine of x.

  • Domain: [-1, -1].

  • Range: [-PI/2, PI/2].

Examples:

asin(-1.0) # => -1.5707963267948966 # -PI/2
asin(0.0)  # => 0.0
asin(1.0)  # => 1.5707963267948966  # PI/2

Returns:


219
220
221
222
223
# File 'math.c', line 219

static VALUE
math_asin(VALUE unused_obj, VALUE x)
{
    math_arc(x, asin)
}

.asinh(x) ⇒ Float

Returns the inverse hyperbolic sine of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

asinh(-INFINITY) # => -Infinity
asinh(0.0)       # => 0.0
asinh(INFINITY)  # => Infinity

Returns:


398
399
400
401
402
# File 'math.c', line 398

static VALUE
math_asinh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(asinh(Get_Double(x)));
}

.atan(x) ⇒ Float

Returns the arc tangent of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-PI/2, PI/2] .

Examples:

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

Returns:


246
247
248
249
250
# File 'math.c', line 246

static VALUE
math_atan(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(atan(Get_Double(x)));
}

.atan2(y, x) ⇒ Float

Returns the arc tangent of y and x in radians.

  • Domain of y: [-INFINITY, INFINITY].

  • Domain of x: [-INFINITY, INFINITY].

  • Range: [-PI, PI].

Examples:

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

Returns:


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'math.c', line 61

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));
}

.atanh(x) ⇒ Float

Returns the inverse hyperbolic tangent of x.

  • Domain: [-1, 1].

  • Range: [-INFINITY, INFINITY].

Examples:

atanh(-1.0) # => -Infinity
atanh(0.0)  # => 0.0
atanh(1.0)  # => Infinity

Returns:


421
422
423
424
425
426
427
428
429
430
431
432
# File 'math.c', line 421

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));
}

.cbrt(x) ⇒ Float

Returns the cube root of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

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

Returns:


741
742
743
744
745
746
747
748
749
750
751
752
# File 'math.c', line 741

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);
}

.cos(x) ⇒ Float

Returns the cosine of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: [-1.0, 1.0].

Examples:

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

Returns:


112
113
114
115
116
# File 'math.c', line 112

static VALUE
math_cos(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(cos(Get_Double(x)));
}

.cosh(x) ⇒ Float

Returns the hyperbolic cosine of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [1, INFINITY].

Examples:

cosh(-INFINITY) # => Infinity
cosh(0.0)       # => 1.0
cosh(INFINITY)  # => Infinity

Returns:


278
279
280
281
282
# File 'math.c', line 278

static VALUE
math_cosh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(cosh(Get_Double(x)));
}

.erf(x) ⇒ Float

Returns the value of the Gauss error function for x.

- Domain: <tt>[-INFINITY, INFINITY]</tt>.
- Range: <tt>[-1, 1]</tt>.

Examples:

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

Related: Math.erfc.

Returns:


874
875
876
877
878
# File 'math.c', line 874

static VALUE
math_erf(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(erf(Get_Double(x)));
}

.erfc(x) ⇒ Float

Returns the value of the complementary error function for x.

- Domain: <tt>[-INFINITY, INFINITY]</tt>.
- Range: <tt>[0, 2]</tt>.

Examples:

  erfc(-INFINITY) # => 2.0
  erfc(0.0)       # => 1.0
  erfc(INFINITY)  # => 0.0

Related: Math.erf.

Returns:


899
900
901
902
903
# File 'math.c', line 899

static VALUE
math_erfc(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(erfc(Get_Double(x)));
}

.exp(x) ⇒ Float

Returns e raised to the x power.

  • Domain: [-INFINITY, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Returns:


455
456
457
458
459
# File 'math.c', line 455

static VALUE
math_exp(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(exp(Get_Double(x)));
}

.frexp(x) ⇒ Array

Returns a 2-element array containing the normalized signed float fraction and integer exponent of x such that:

x = fraction * 2**exponent

See IEEE 754 double-precision binary floating-point format: binary64.

  • Domain: [-INFINITY, INFINITY].

  • Range [-INFINITY, INFINITY].

Examples:

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]

Related: Math.ldexp (inverse of Math.frexp).

Returns:


782
783
784
785
786
787
788
789
790
# File 'math.c', line 782

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));
}

.gamma(x) ⇒ Float

Returns the value of the gamma function for x.

- Domain: <tt>(-INFINITY, INFINITY]</tt> excluding negative integers.
- Range: <tt>[-INFINITY, INFINITY]</tt>.

Examples:

  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

Related: Math.lgamma.

Returns:


930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
# File 'math.c', line 930

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));
}

.hypot(a, b) ⇒ Float

Returns sqrt(a**2 + b**2), which is the length of the longest side c (the hypotenuse) of the right triangle whose other sides have lengths a and b.

  • Domain of a: [-INFINITY, INFINITY].

  • Domain of +ab: [-INFINITY, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Note that if either argument is INFINITY or -INFINITY, the result is Infinity.

Returns:


849
850
851
852
853
# File 'math.c', line 849

static VALUE
math_hypot(VALUE unused_obj, VALUE x, VALUE y)
{
    return DBL2NUM(hypot(Get_Double(x), Get_Double(y)));
}

.ldexp(fraction, exponent) ⇒ Float

Returns the value of fraction * 2**exponent.

  • Domain of fraction: [0.0, 1.0).

  • Domain of exponent: [0, 1024] (larger values are equivalent to 1024).

See IEEE 754 double-precision binary floating-point format: binary64.

Examples:

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

Related: Math.frexp (inverse of Math.ldexp).

Returns:


818
819
820
821
822
# File 'math.c', line 818

static VALUE
math_ldexp(VALUE unused_obj, VALUE x, VALUE n)
{
    return DBL2NUM(ldexp(Get_Double(x), NUM2INT(n)));
}

.lgamma(x) ⇒ Array, ...

Returns a 2-element array equivalent to:

  [Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]

See {logarithmic gamma function}[https://en.wikipedia.org/wiki/Gamma_function#The_log-gamma_function].

- Domain: <tt>(-INFINITY, INFINITY]</tt>.
- Range of first element: <tt>(-INFINITY, INFINITY]</tt>.
- Second element is -1 or 1.

Examples:

  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]

Related: Math.gamma.

Returns ].

Returns:


1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
# File 'math.c', line 1019

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));
}

.log(x, base = Math::E) ⇒ Float

Returns the base base logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY)].

Examples:

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

Returns:


505
506
507
508
509
# File 'math.c', line 505

static VALUE
math_log(int argc, const VALUE *argv, VALUE unused_obj)
{
    return rb_math_log(argc, argv);
}

.log10(x) ⇒ Float

Returns the base 10 logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

log10(0.0)      # => -Infinity
log10(1.0)      # => 0.0
log10(10.0)     # => 1.0
log10(INFINITY) # => Infinity

Returns:


637
638
639
640
641
642
643
644
645
646
647
648
# File 'math.c', line 637

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) */
}

.log2(x) ⇒ Float

Returns the base 2 logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

log2(0.0)      # => -Infinity
log2(1.0)      # => 0.0
log2(2.0)      # => 1.0
log2(INFINITY) # => Infinity

Returns:


606
607
608
609
610
611
612
613
614
615
616
617
# File 'math.c', line 606

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) */
}

.sin(x) ⇒ Float

Returns the sine of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: [-1.0, 1.0].

Examples:

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

Returns:


139
140
141
142
143
# File 'math.c', line 139

static VALUE
math_sin(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(sin(Get_Double(x)));
}

.sinh(x) ⇒ Float

Returns the hyperbolic sine of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

sinh(-INFINITY) # => -Infinity
sinh(0.0)       # => 0.0
sinh(INFINITY)  # => Infinity

Returns:


310
311
312
313
314
# File 'math.c', line 310

static VALUE
math_sinh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(sinh(Get_Double(x)));
}

.sqrt(x) ⇒ Float

Returns the principal (non-negative) square root of x.

  • Domain: [0, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Returns:


673
674
675
676
677
# File 'math.c', line 673

static VALUE
math_sqrt(VALUE unused_obj, VALUE x)
{
    return rb_math_sqrt(x);
}

.tan(x) ⇒ Float

Returns the tangent of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: (-INFINITY, INFINITY).

Examples:

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

Returns:


167
168
169
170
171
# File 'math.c', line 167

static VALUE
math_tan(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(tan(Get_Double(x)));
}

.tanh(x) ⇒ Float

Returns the hyperbolic tangent of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-1, 1].

Examples:

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

Returns:


349
350
351
352
353
# File 'math.c', line 349

static VALUE
math_tanh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(tanh(Get_Double(x)));
}

Instance Method Details

#acos(x) ⇒ Float (private)

Returns the arc cosine of x.

  • Domain: [-1, 1].

  • Range: [0, PI].

Examples:

acos(-1.0) # => 3.141592653589793  # PI
acos(0.0)  # => 1.5707963267948966 # PI/2
acos(1.0)  # => 0.0

Returns:


196
197
198
199
200
# File 'math.c', line 196

static VALUE
math_acos(VALUE unused_obj, VALUE x)
{
    math_arc(x, acos)
}

#acosh(x) ⇒ Float (private)

Returns the inverse hyperbolic cosine of x.

  • Domain: [1, INFINITY].

  • Range: [0, INFINITY].

Examples:

acosh(1.0)      # => 0.0
acosh(INFINITY) # => Infinity

Returns:


371
372
373
374
375
376
377
378
379
# File 'math.c', line 371

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));
}

#asin(x) ⇒ Float (private)

Returns the arc sine of x.

  • Domain: [-1, -1].

  • Range: [-PI/2, PI/2].

Examples:

asin(-1.0) # => -1.5707963267948966 # -PI/2
asin(0.0)  # => 0.0
asin(1.0)  # => 1.5707963267948966  # PI/2

Returns:


219
220
221
222
223
# File 'math.c', line 219

static VALUE
math_asin(VALUE unused_obj, VALUE x)
{
    math_arc(x, asin)
}

#asinh(x) ⇒ Float (private)

Returns the inverse hyperbolic sine of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

asinh(-INFINITY) # => -Infinity
asinh(0.0)       # => 0.0
asinh(INFINITY)  # => Infinity

Returns:


398
399
400
401
402
# File 'math.c', line 398

static VALUE
math_asinh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(asinh(Get_Double(x)));
}

#atan(x) ⇒ Float (private)

Returns the arc tangent of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-PI/2, PI/2] .

Examples:

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

Returns:


246
247
248
249
250
# File 'math.c', line 246

static VALUE
math_atan(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(atan(Get_Double(x)));
}

#atan2(y, x) ⇒ Float (private)

Returns the arc tangent of y and x in radians.

  • Domain of y: [-INFINITY, INFINITY].

  • Domain of x: [-INFINITY, INFINITY].

  • Range: [-PI, PI].

Examples:

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

Returns:


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'math.c', line 61

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));
}

#atanh(x) ⇒ Float (private)

Returns the inverse hyperbolic tangent of x.

  • Domain: [-1, 1].

  • Range: [-INFINITY, INFINITY].

Examples:

atanh(-1.0) # => -Infinity
atanh(0.0)  # => 0.0
atanh(1.0)  # => Infinity

Returns:


421
422
423
424
425
426
427
428
429
430
431
432
# File 'math.c', line 421

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));
}

#cbrt(x) ⇒ Float (private)

Returns the cube root of x.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

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

Returns:


741
742
743
744
745
746
747
748
749
750
751
752
# File 'math.c', line 741

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);
}

#cos(x) ⇒ Float (private)

Returns the cosine of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: [-1.0, 1.0].

Examples:

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

Returns:


112
113
114
115
116
# File 'math.c', line 112

static VALUE
math_cos(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(cos(Get_Double(x)));
}

#cosh(x) ⇒ Float (private)

Returns the hyperbolic cosine of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [1, INFINITY].

Examples:

cosh(-INFINITY) # => Infinity
cosh(0.0)       # => 1.0
cosh(INFINITY)  # => Infinity

Returns:


278
279
280
281
282
# File 'math.c', line 278

static VALUE
math_cosh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(cosh(Get_Double(x)));
}

#erf(x) ⇒ Float (private)

Returns the value of the Gauss error function for x.

- Domain: <tt>[-INFINITY, INFINITY]</tt>.
- Range: <tt>[-1, 1]</tt>.

Examples:

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

Related: Math.erfc.

Returns:


874
875
876
877
878
# File 'math.c', line 874

static VALUE
math_erf(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(erf(Get_Double(x)));
}

#erfc(x) ⇒ Float (private)

Returns the value of the complementary error function for x.

- Domain: <tt>[-INFINITY, INFINITY]</tt>.
- Range: <tt>[0, 2]</tt>.

Examples:

  erfc(-INFINITY) # => 2.0
  erfc(0.0)       # => 1.0
  erfc(INFINITY)  # => 0.0

Related: Math.erf.

Returns:


899
900
901
902
903
# File 'math.c', line 899

static VALUE
math_erfc(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(erfc(Get_Double(x)));
}

#exp(x) ⇒ Float (private)

Returns e raised to the x power.

  • Domain: [-INFINITY, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Returns:


455
456
457
458
459
# File 'math.c', line 455

static VALUE
math_exp(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(exp(Get_Double(x)));
}

#frexp(x) ⇒ Array (private)

Returns a 2-element array containing the normalized signed float fraction and integer exponent of x such that:

x = fraction * 2**exponent

See IEEE 754 double-precision binary floating-point format: binary64.

  • Domain: [-INFINITY, INFINITY].

  • Range [-INFINITY, INFINITY].

Examples:

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]

Related: Math.ldexp (inverse of Math.frexp).

Returns:


782
783
784
785
786
787
788
789
790
# File 'math.c', line 782

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));
}

#gamma(x) ⇒ Float (private)

Returns the value of the gamma function for x.

- Domain: <tt>(-INFINITY, INFINITY]</tt> excluding negative integers.
- Range: <tt>[-INFINITY, INFINITY]</tt>.

Examples:

  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

Related: Math.lgamma.

Returns:


930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
# File 'math.c', line 930

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));
}

#hypot(a, b) ⇒ Float (private)

Returns sqrt(a**2 + b**2), which is the length of the longest side c (the hypotenuse) of the right triangle whose other sides have lengths a and b.

  • Domain of a: [-INFINITY, INFINITY].

  • Domain of +ab: [-INFINITY, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Note that if either argument is INFINITY or -INFINITY, the result is Infinity.

Returns:


849
850
851
852
853
# File 'math.c', line 849

static VALUE
math_hypot(VALUE unused_obj, VALUE x, VALUE y)
{
    return DBL2NUM(hypot(Get_Double(x), Get_Double(y)));
}

#ldexp(fraction, exponent) ⇒ Float (private)

Returns the value of fraction * 2**exponent.

  • Domain of fraction: [0.0, 1.0).

  • Domain of exponent: [0, 1024] (larger values are equivalent to 1024).

See IEEE 754 double-precision binary floating-point format: binary64.

Examples:

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

Related: Math.frexp (inverse of Math.ldexp).

Returns:


818
819
820
821
822
# File 'math.c', line 818

static VALUE
math_ldexp(VALUE unused_obj, VALUE x, VALUE n)
{
    return DBL2NUM(ldexp(Get_Double(x), NUM2INT(n)));
}

#lgamma(x) ⇒ Array, ... (private)

Returns a 2-element array equivalent to:

  [Math.log(Math.gamma(x).abs), Math.gamma(x) < 0 ? -1 : 1]

See {logarithmic gamma function}[https://en.wikipedia.org/wiki/Gamma_function#The_log-gamma_function].

- Domain: <tt>(-INFINITY, INFINITY]</tt>.
- Range of first element: <tt>(-INFINITY, INFINITY]</tt>.
- Second element is -1 or 1.

Examples:

  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]

Related: Math.gamma.

Returns ].

Returns:


1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
# File 'math.c', line 1019

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));
}

#log(x, base = Math::E) ⇒ Float (private)

Returns the base base logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY)].

Examples:

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

Returns:


505
506
507
508
509
# File 'math.c', line 505

static VALUE
math_log(int argc, const VALUE *argv, VALUE unused_obj)
{
    return rb_math_log(argc, argv);
}

#log10(x) ⇒ Float (private)

Returns the base 10 logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

log10(0.0)      # => -Infinity
log10(1.0)      # => 0.0
log10(10.0)     # => 1.0
log10(INFINITY) # => Infinity

Returns:


637
638
639
640
641
642
643
644
645
646
647
648
# File 'math.c', line 637

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) */
}

#log2(x) ⇒ Float (private)

Returns the base 2 logarithm of x.

  • Domain: [0, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

log2(0.0)      # => -Infinity
log2(1.0)      # => 0.0
log2(2.0)      # => 1.0
log2(INFINITY) # => Infinity

Returns:


606
607
608
609
610
611
612
613
614
615
616
617
# File 'math.c', line 606

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) */
}

#sin(x) ⇒ Float (private)

Returns the sine of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: [-1.0, 1.0].

Examples:

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

Returns:


139
140
141
142
143
# File 'math.c', line 139

static VALUE
math_sin(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(sin(Get_Double(x)));
}

#sinh(x) ⇒ Float (private)

Returns the hyperbolic sine of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-INFINITY, INFINITY].

Examples:

sinh(-INFINITY) # => -Infinity
sinh(0.0)       # => 0.0
sinh(INFINITY)  # => Infinity

Returns:


310
311
312
313
314
# File 'math.c', line 310

static VALUE
math_sinh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(sinh(Get_Double(x)));
}

#sqrt(x) ⇒ Float (private)

Returns the principal (non-negative) square root of x.

  • Domain: [0, INFINITY].

  • Range: [0, INFINITY].

Examples:

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

Returns:


673
674
675
676
677
# File 'math.c', line 673

static VALUE
math_sqrt(VALUE unused_obj, VALUE x)
{
    return rb_math_sqrt(x);
}

#tan(x) ⇒ Float (private)

Returns the tangent of x in radians.

  • Domain: (-INFINITY, INFINITY).

  • Range: (-INFINITY, INFINITY).

Examples:

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

Returns:


167
168
169
170
171
# File 'math.c', line 167

static VALUE
math_tan(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(tan(Get_Double(x)));
}

#tanh(x) ⇒ Float (private)

Returns the hyperbolic tangent of x in radians.

  • Domain: [-INFINITY, INFINITY].

  • Range: [-1, 1].

Examples:

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

Returns:


349
350
351
352
353
# File 'math.c', line 349

static VALUE
math_tanh(VALUE unused_obj, VALUE x)
{
    return DBL2NUM(tanh(Get_Double(x)));
}