| 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
Public Instance methods
# 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
# 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
# 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
# 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
# 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
# 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
# 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