Module Math
In: math.c
lib/complex.rb

The Math module contains module functions for basic trigonometric and transcendental functions. See class Float for a list of constants that define Ruby’s floating point accuracy.

Methods

acos   acos   acos!   acosh   acosh   acosh!   asin   asin   asin!   asinh   asinh   asinh!   atan   atan   atan!   atan2   atan2   atan2!   atanh   atanh   atanh!   cos   cos   cos!   cosh   cosh   cosh!   erf   erfc   exp   exp   exp!   frexp   hypot   ldexp   log   log   log!   log10   log10   log10!   sin   sin   sin!   sinh   sinh   sinh!   sqrt   sqrt   sqrt!   tan   tan   tan!   tanh   tanh   tanh!  

Constants

PI = rb_float_new(M_PI)
PI = rb_float_new(atan(1.0)*4.0)
E = rb_float_new(M_E)
E = rb_float_new(exp(1.0))

Public Instance methods

[Source]

     # File lib/complex.rb, line 534
534:   def acos(z)
535:     if Complex.generic?(z) and z >= -1 and z <= 1
536:       acos!(z)
537:     else
538:       -1.0.im * log( z + 1.0.im * sqrt(1.0-z*z) )
539:     end
540:   end

Computes the arc cosine of x. Returns 0..PI.

[Source]

/*
 *  call-seq:
 *     Math.acos(x)    => float
 *  
 *  Computes the arc cosine of <i>x</i>. Returns 0..PI.
 */

static VALUE
math_acos(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = acos(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("acos");
    }
    return rb_float_new(d);
}
acos!(p1)

Alias for acos

Computes the inverse hyperbolic cosine of x.

[Source]

/*
 *  call-seq:
 *     Math.acosh(x)    => float
 *  
 *  Computes the inverse hyperbolic cosine of <i>x</i>.
 */

static VALUE
math_acosh(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = acosh(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("acosh");
    }
    return rb_float_new(d);
}

[Source]

     # File lib/complex.rb, line 566
566:   def acosh(z)
567:     if Complex.generic?(z) and z >= 1
568:       acosh!(z)
569:     else
570:       log( z + sqrt(z*z-1.0) )
571:     end
572:   end
acosh!(p1)

Alias for acosh

Computes the arc sine of x. Returns 0..PI.

[Source]

/*
 *  call-seq:
 *     Math.asin(x)    => float
 *  
 *  Computes the arc sine of <i>x</i>. Returns 0..PI.
 */

static VALUE
math_asin(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = asin(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("asin");
    }
    return rb_float_new(d);
}

[Source]

     # File lib/complex.rb, line 542
542:   def asin(z)
543:     if Complex.generic?(z) and z >= -1 and z <= 1
544:       asin!(z)
545:     else
546:       -1.0.im * log( 1.0.im * z + sqrt(1.0-z*z) )
547:     end
548:   end
asin!(p1)

Alias for asin

[Source]

     # File lib/complex.rb, line 574
574:   def asinh(z)
575:     if Complex.generic?(z)
576:       asinh!(z)
577:     else
578:       log( z + sqrt(1.0+z*z) )
579:     end
580:   end

Computes the inverse hyperbolic sine of x.

[Source]

/*
 *  call-seq:
 *     Math.asinh(x)    => float
 *  
 *  Computes the inverse hyperbolic sine of <i>x</i>.
 */

static VALUE
math_asinh(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(asinh(RFLOAT(x)->value));
}
asinh!(p1)

Alias for asinh

Computes the arc tangent of x. Returns -{PI/2} .. {PI/2}.

[Source]

/*
 *  call-seq:
 *     Math.atan(x)    => float
 *  
 *  Computes the arc tangent of <i>x</i>. Returns -{PI/2} .. {PI/2}.
 */

static VALUE
math_atan(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(atan(RFLOAT(x)->value));
}

[Source]

     # File lib/complex.rb, line 550
550:   def atan(z)
551:     if Complex.generic?(z)
552:       atan!(z)
553:     else
554:       1.0.im * log( (1.0.im+z) / (1.0.im-z) ) / 2.0
555:     end
556:   end
atan!(p1)

Alias for atan

[Source]

     # File lib/complex.rb, line 558
558:   def atan2(y,x)
559:     if Complex.generic?(y) and Complex.generic?(x)
560:       atan2!(y,x)
561:     else
562:       -1.0.im * log( (x+1.0.im*y) / sqrt(x*x+y*y) )
563:     end
564:   end

Computes the arc tangent given y and x. Returns -PI..PI.

[Source]

/*
 *  call-seq:
 *     Math.atan2(y, x)  => float
 *  
 *  Computes the arc tangent given <i>y</i> and <i>x</i>. Returns
 *  -PI..PI.
 *     
 */

static VALUE
math_atan2(obj, y, x)
    VALUE obj, x, y;
{
    Need_Float2(y, x);
    return rb_float_new(atan2(RFLOAT(y)->value, RFLOAT(x)->value));
}
atan2!(p1, p2)

Alias for atan2

Computes the inverse hyperbolic tangent of x.

[Source]

/*
 *  call-seq:
 *     Math.atanh(x)    => float
 *  
 *  Computes the inverse hyperbolic tangent of <i>x</i>.
 */

static VALUE
math_atanh(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = atanh(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("atanh");
    }
    return rb_float_new(d);
}

[Source]

     # File lib/complex.rb, line 582
582:   def atanh(z)
583:     if Complex.generic?(z) and z >= -1 and z <= 1
584:       atanh!(z)
585:     else
586:       log( (1.0+z) / (1.0-z) ) / 2.0
587:     end
588:   end
atanh!(p1)

Alias for atanh

Computes the cosine of x (expressed in radians). Returns -1..1.

[Source]

/*
 *  call-seq:
 *     Math.cos(x)    => float
 *  
 *  Computes the cosine of <i>x</i> (expressed in radians). Returns
 *  -1..1.
 */

static VALUE
math_cos(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(cos(RFLOAT(x)->value));
}

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 463
463:   def cos(z)
464:     if Complex.generic?(z)
465:       cos!(z)
466:     else
467:       Complex(cos!(z.real)*cosh!(z.image),
468:               -sin!(z.real)*sinh!(z.image))
469:     end
470:   end
cos!(p1)

Alias for cos

Computes the hyperbolic cosine of x (expressed in radians).

[Source]

/*
 *  call-seq:
 *     Math.cosh(x)    => float
 *  
 *  Computes the hyperbolic cosine of <i>x</i> (expressed in radians).
 */

static VALUE
math_cosh(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    
    return rb_float_new(cosh(RFLOAT(x)->value));
}

[Source]

     # File lib/complex.rb, line 499
499:   def cosh(z)
500:     if Complex.generic?(z)
501:       cosh!(z)
502:     else
503:       Complex( cosh!(z.real)*cos!(z.image), sinh!(z.real)*sin!(z.image) )
504:     end
505:   end
cosh!(p1)

Alias for cosh

Calculates the error function of x.

[Source]

/*
 * call-seq:
 *    Math.erf(x)  => float
 *
 *  Calculates the error function of x.
 */

static VALUE
math_erf(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(erf(RFLOAT(x)->value));
}

Calculates the complementary error function of x.

[Source]

/*
 * call-seq:
 *    Math.erfc(x)  => float
 *
 *  Calculates the complementary error function of x.
 */

static VALUE
math_erfc(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(erfc(RFLOAT(x)->value));
}

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 454
454:   def exp(z)
455:     if Complex.generic?(z)
456:       exp!(z)
457:     else
458:       Complex(exp!(z.real) * cos!(z.image), exp!(z.real) * sin!(z.image))
459:     end
460:   end

Returns e**x.

[Source]

/*
 *  call-seq:
 *     Math.exp(x)    => float
 *  
 *  Returns e**x.
 */

static VALUE
math_exp(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(exp(RFLOAT(x)->value));
}
exp!(p1)

Alias for exp

Returns a two-element array containing the normalized fraction (a Float) and exponent (a Fixnum) of numeric.

   fraction, exponent = Math.frexp(1234)   #=> [0.6025390625, 11]
   fraction * 2**exponent                  #=> 1234.0

[Source]

/*
 *  call-seq:
 *     Math.frexp(numeric)    => [ fraction, exponent ]
 *  
 *  Returns a two-element array containing the normalized fraction (a
 *  <code>Float</code>) and exponent (a <code>Fixnum</code>) of
 *  <i>numeric</i>.
 *     
 *     fraction, exponent = Math.frexp(1234)   #=> [0.6025390625, 11]
 *     fraction * 2**exponent                  #=> 1234.0
 */

static VALUE
math_frexp(obj, x)
    VALUE obj, x;
{
    double d;
    int exp;

    Need_Float(x);
    
    d = frexp(RFLOAT(x)->value, &exp);
    return rb_assoc_new(rb_float_new(d), INT2NUM(exp));
}

Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle with sides x and y.

   Math.hypot(3, 4)   #=> 5.0

[Source]

/*
 *  call-seq:
 *     Math.hypot(x, y)    => float
 *  
 *  Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle
 *  with sides <i>x</i> and <i>y</i>.
 *     
 *     Math.hypot(3, 4)   #=> 5.0
 */

static VALUE
math_hypot(obj, x, y)
    VALUE obj, x, y;
{
    Need_Float2(x, y);
    return rb_float_new(hypot(RFLOAT(x)->value, RFLOAT(y)->value));
}

Returns the value of flt*(2**int).

   fraction, exponent = Math.frexp(1234)
   Math.ldexp(fraction, exponent)   #=> 1234.0

[Source]

/*
 *  call-seq:
 *     Math.ldexp(flt, int) -> float
 *  
 *  Returns the value of <i>flt</i>*(2**<i>int</i>).
 *     
 *     fraction, exponent = Math.frexp(1234)
 *     Math.ldexp(fraction, exponent)   #=> 1234.0
 */

static VALUE
math_ldexp(obj, x, n)
    VALUE obj, x, n;
{
    Need_Float(x);
    return rb_float_new(ldexp(RFLOAT(x)->value, NUM2INT(n)));
}

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 516
516:   def log(z)
517:     if Complex.generic?(z) and z >= 0
518:       log!(z)
519:     else
520:       r, theta = z.polar
521:       Complex(log!(r.abs), theta)
522:     end
523:   end

Returns the natural logarithm of numeric.

[Source]

/*
 *  call-seq:
 *     Math.log(numeric)    => float
 *  
 *  Returns the natural logarithm of <i>numeric</i>.
 */

static VALUE
math_log(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = log(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("log");
    }
    return rb_float_new(d);
}
log!(p1)

Alias for log

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 526
526:   def log10(z)
527:     if Complex.generic?(z)
528:       log10!(z)
529:     else
530:       log(z)/log!(10)
531:     end
532:   end

Returns the base 10 logarithm of numeric.

[Source]

/*
 *  call-seq:
 *     Math.log10(numeric)    => float
 *  
 *  Returns the base 10 logarithm of <i>numeric</i>.
 */

static VALUE
math_log10(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = log10(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("log10");
    }
    return rb_float_new(d);
}
log10!(p1)

Alias for log10

Computes the sine of x (expressed in radians). Returns -1..1.

[Source]

/*
 *  call-seq:
 *     Math.sin(x)    => float
 *  
 *  Computes the sine of <i>x</i> (expressed in radians). Returns
 *  -1..1.
 */

static VALUE
math_sin(obj, x)
    VALUE obj, x;
{
    Need_Float(x);

    return rb_float_new(sin(RFLOAT(x)->value));
}

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 473
473:   def sin(z)
474:     if Complex.generic?(z)
475:       sin!(z)
476:     else
477:       Complex(sin!(z.real)*cosh!(z.image),
478:               cos!(z.real)*sinh!(z.image))
479:     end
480:   end
sin!(p1)

Alias for sin

[Source]

     # File lib/complex.rb, line 491
491:   def sinh(z)
492:     if Complex.generic?(z)
493:       sinh!(z)
494:     else
495:       Complex( sinh!(z.real)*cos!(z.image), cosh!(z.real)*sin!(z.image) )
496:     end
497:   end

Computes the hyperbolic sine of x (expressed in radians).

[Source]

/*
 *  call-seq:
 *     Math.sinh(x)    => float
 *  
 *  Computes the hyperbolic sine of <i>x</i> (expressed in
 *  radians).
 */

static VALUE
math_sinh(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(sinh(RFLOAT(x)->value));
}
sinh!(p1)

Alias for sinh

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 435
435:   def sqrt(z)
436:     if Complex.generic?(z)
437:       if z >= 0
438:         sqrt!(z)
439:       else
440:         Complex(0,sqrt!(-z))
441:       end
442:     else
443:       if z.image < 0
444:         sqrt(z.conjugate).conjugate
445:       else
446:         r = z.abs
447:         x = z.real
448:         Complex( sqrt!((r+x)/2), sqrt!((r-x)/2) )
449:       end
450:     end
451:   end

Returns the non-negative square root of numeric. Raises ArgError if numeric is less than zero.

[Source]

/*
 *  call-seq:
 *     Math.sqrt(numeric)    => float
 *  
 *  Returns the non-negative square root of <i>numeric</i>. Raises
 *  <code>ArgError</code> if <i>numeric</i> is less than zero.
 */

static VALUE
math_sqrt(obj, x)
    VALUE obj, x;
{
    double d;

    Need_Float(x);
    errno = 0;
    d = sqrt(RFLOAT(x)->value);
    if (errno) {
        rb_sys_fail("sqrt");
    }
    return rb_float_new(d);
}
sqrt!(p1)

Alias for sqrt

Returns the tangent of x (expressed in radians).

[Source]

/*
 *  call-seq:
 *     Math.tan(x)    => float
 *  
 *  Returns the tangent of <i>x</i> (expressed in radians).
 */

static VALUE
math_tan(obj, x)
    VALUE obj, x;
{
    Need_Float(x);

    return rb_float_new(tan(RFLOAT(x)->value));
}

Redefined to handle a Complex argument.

[Source]

     # File lib/complex.rb, line 483
483:   def tan(z)
484:     if Complex.generic?(z)
485:       tan!(z)
486:     else
487:       sin(z)/cos(z)
488:     end
489:   end
tan!(p1)

Alias for tan

Computes the hyperbolic tangent of x (expressed in radians).

[Source]

/*
 *  call-seq:
 *     Math.tanh()    => float
 *  
 *  Computes the hyperbolic tangent of <i>x</i> (expressed in
 *  radians).
 */

static VALUE
math_tanh(obj, x)
    VALUE obj, x;
{
    Need_Float(x);
    return rb_float_new(tanh(RFLOAT(x)->value));
}

[Source]

     # File lib/complex.rb, line 507
507:   def tanh(z)
508:     if Complex.generic?(z)
509:       tanh!(z)
510:     else
511:       sinh(z)/cosh(z)
512:     end
513:   end
tanh!(p1)

Alias for tanh

[Validate]