Module BigMath
In: bigdecimal/math.rb

Contents:

  sqrt(x, prec)
  sin (x, prec)
  cos (x, prec)
  atan(x, prec)  Note: |x|<1, x=0.9999 may not converge.
  exp (x, prec)
  log (x, prec)
  PI  (prec)
  E   (prec) == exp(1.0,prec)

where:

  x    ... BigDecimal number to be computed.
           |x| must be small enough to get convergence.
  prec ... Number of digits to be obtained.

Usage:

  require "bigdecimal"
  require "bigdecimal/math.rb"
  include BigMath
  a = BigDecimal((PI(100)/2).to_s)
  puts sin(a,100) # => 0.10000000000000000000......E1

Methods

E   PI   atan   cos   exp   log   sin   sqrt  

Public Instance methods

[Source]

     # File bigdecimal/math.rb, line 179
179:   def E(prec)
180:     raise ArgumentError, "Zero or negative precision for E" if prec <= 0
181:     n    = prec + BigDecimal.double_fig
182:     one  = BigDecimal("1")
183:     y  = one
184:     d  = y
185:     z  = one
186:     i  = 0
187:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
188:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
189:       i += 1
190:       z *= i
191:       d  = one.div(z,m)
192:       y += d
193:     end
194:     y
195:   end

[Source]

     # File bigdecimal/math.rb, line 141
141:   def PI(prec)
142:     raise ArgumentError, "Zero or negative argument for PI" if prec <= 0
143:     n      = prec + BigDecimal.double_fig
144:     zero   = BigDecimal("0")
145:     one    = BigDecimal("1")
146:     two    = BigDecimal("2")
147: 
148:     m25    = BigDecimal("-0.04")
149:     m57121 = BigDecimal("-57121")
150: 
151:     pi     = zero
152: 
153:     d = one
154:     k = one
155:     w = one
156:     t = BigDecimal("-80")
157:     while d.nonzero? && ((m = n - (pi.exponent - d.exponent).abs) > 0)
158:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
159:       t   = t*m25
160:       d   = t.div(k,m)
161:       k   = k+two
162:       pi  = pi + d
163:     end
164: 
165:     d = one
166:     k = one
167:     w = one
168:     t = BigDecimal("956")
169:     while d.nonzero? && ((m = n - (pi.exponent - d.exponent).abs) > 0)
170:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
171:       t   = t.div(m57121,n)
172:       d   = t.div(k,m)
173:       pi  = pi + d
174:       k   = k+two
175:     end
176:     pi
177:   end

[Source]

    # File bigdecimal/math.rb, line 79
79:   def atan(x, prec)
80:     raise ArgumentError, "Zero or negative precision for atan" if prec <= 0
81:     return BigDecimal("NaN") if x.infinite? || x.nan?
82:     raise ArgumentError, "x.abs must be less than 1.0" if x.abs>=1
83:     n    = prec + BigDecimal.double_fig
84:     y = x
85:     d = y
86:     t = x
87:     r = BigDecimal("3")
88:     x2 = x.mult(x,n)
89:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
90:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
91:       t = -t.mult(x2,n)
92:       d = t.div(r,m)
93:       y += d
94:       r += 2
95:     end
96:     y
97:   end

[Source]

    # File bigdecimal/math.rb, line 54
54:   def cos(x, prec)
55:     raise ArgumentError, "Zero or negative precision for cos" if prec <= 0
56:     return BigDecimal("NaN") if x.infinite? || x.nan?
57:     n    = prec + BigDecimal.double_fig
58:     one  = BigDecimal("1")
59:     two  = BigDecimal("2")
60:     x1 = one
61:     x2 = x.mult(x,n)
62:     sign = 1
63:     y = one
64:     d = y
65:     i = BigDecimal("0")
66:     z = one
67:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
68:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
69:       sign = -sign
70:       x1  = x2.mult(x1,n)
71:       i  += two
72:       z  *= (i-one) * i
73:       d   = sign * x1.div(z,m)
74:       y  += d
75:     end
76:     y
77:   end

[Source]

     # File bigdecimal/math.rb, line 99
 99:   def exp(x, prec)
100:     raise ArgumentError, "Zero or negative precision for exp" if prec <= 0
101:     return BigDecimal("NaN") if x.infinite? || x.nan?
102:     n    = prec + BigDecimal.double_fig
103:     one  = BigDecimal("1")
104:     x1 = one
105:     y  = one
106:     d  = y
107:     z  = one
108:     i  = 0
109:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
110:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
111:       x1  = x1.mult(x,n)
112:       i += 1
113:       z *= i
114:       d  = x1.div(z,m)
115:       y += d
116:     end
117:     y
118:   end

[Source]

     # File bigdecimal/math.rb, line 120
120:   def log(x, prec)
121:     raise ArgumentError, "Zero or negative argument for log" if x <= 0 || prec <= 0
122:     return x if x.infinite? || x.nan?
123:     one = BigDecimal("1")
124:     two = BigDecimal("2")
125:     n  = prec + BigDecimal.double_fig
126:     x  = (x - one).div(x + one,n)
127:     x2 = x.mult(x,n)
128:     y  = x
129:     d  = y
130:     i = one
131:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
132:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
133:       x  = x2.mult(x,n)
134:       i += two
135:       d  = x.div(i,m)
136:       y += d
137:     end
138:     y*two
139:   end

[Source]

    # File bigdecimal/math.rb, line 29
29:   def sin(x, prec)
30:     raise ArgumentError, "Zero or negative precision for sin" if prec <= 0
31:     return BigDecimal("NaN") if x.infinite? || x.nan?
32:     n    = prec + BigDecimal.double_fig
33:     one  = BigDecimal("1")
34:     two  = BigDecimal("2")
35:     x1   = x
36:     x2   = x.mult(x,n)
37:     sign = 1
38:     y    = x
39:     d    = y
40:     i    = one
41:     z    = one
42:     while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
43:       m = BigDecimal.double_fig if m < BigDecimal.double_fig
44:       sign = -sign
45:       x1  = x2.mult(x1,n)
46:       i  += two
47:       z  *= (i-one) * i
48:       d   = sign * x1.div(z,m)
49:       y  += d
50:     end
51:     y
52:   end

[Source]

    # File bigdecimal/math.rb, line 25
25:   def sqrt(x,prec)
26:     x.sqrt(prec)
27:   end

Search

Google

Ruby API Docs

Links