Method: BigMathR::Const::PI.euler

Defined in:
lib/bigdecimal/math_r/const/PI_euler.rb

.euler(prec) ⇒ BigDecimal

Implement by Euler’s formula.

Examples:

BigMathR::Const::PI.euler(20)
#=> 0.31415926535897932385e1

Parameters:

  • prec (Integer)

    Arbitrary precision

Returns:

  • (BigDecimal)

    Constant PI

Raises:

  • (TypeError)

    not an Integer

  • (RangeError)

    Zero or negative precision



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/bigdecimal/math_r/const/PI_euler.rb', line 18

def euler(prec)
  raise TypeError, "precision must be an Integer" unless prec.class == Integer
  raise RangeError, "Zero or negative precision" if prec <= 0
  n = BigDecimal.double_fig + prec
  one = BigDecimal(1)
  two = BigDecimal(2)
  s = BigDecimal(0)
  t = one
  t1 = BigDecimal(0)
  t2 = one
  n = prec + BigDecimal.double_fig
  while t.nonzero? && ((m = n - (s.exponent - t.exponent).abs) > 0)
    m = BigDecimal.double_fig if m < BigDecimal.double_fig
    s = s + t
    t1 = t1 + one;  t = t.mult(t1, m)
    t2 = t2 + two;  t = t.div(t2, m)
  end
  two.mult(s, prec)
end