long-decimal 0.00.22 → 0.01.00
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +157 -32
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.src/M000036.html +1 -1
- data/doc/classes/LongDecimal.src/M000037.html +1 -1
- data/doc/classes/LongDecimal.src/M000038.html +1 -1
- data/doc/classes/LongDecimal.src/M000039.html +1 -1
- data/doc/classes/LongDecimal.src/M000040.html +1 -1
- data/doc/classes/LongDecimal.src/M000041.html +1 -1
- data/doc/classes/LongDecimal.src/M000042.html +1 -1
- data/doc/classes/LongDecimal.src/M000043.html +1 -1
- data/doc/classes/LongDecimal.src/M000044.html +1 -1
- data/doc/classes/LongDecimal.src/M000045.html +1 -1
- data/doc/classes/LongDecimal.src/M000046.html +1 -1
- data/doc/classes/LongDecimal.src/M000047.html +1 -1
- data/doc/classes/LongDecimal.src/M000048.html +1 -1
- data/doc/classes/LongDecimal.src/M000049.html +1 -1
- data/doc/classes/LongDecimal.src/M000050.html +1 -1
- data/doc/classes/LongDecimal.src/M000051.html +1 -1
- data/doc/classes/LongDecimal.src/M000052.html +1 -1
- data/doc/classes/LongDecimal.src/M000053.html +1 -1
- data/doc/classes/LongDecimal.src/M000054.html +1 -1
- data/doc/classes/LongDecimal.src/M000055.html +1 -1
- data/doc/classes/LongDecimal.src/M000056.html +1 -1
- data/doc/classes/LongDecimal.src/M000057.html +1 -1
- data/doc/classes/LongDecimal.src/M000058.html +1 -1
- data/doc/classes/LongDecimal.src/M000059.html +1 -1
- data/doc/classes/LongDecimal.src/M000060.html +1 -1
- data/doc/classes/LongDecimal.src/M000062.html +1 -1
- data/doc/classes/LongDecimal.src/M000063.html +1 -1
- data/doc/classes/LongDecimal.src/M000064.html +1 -1
- data/doc/classes/LongDecimal.src/M000065.html +1 -1
- data/doc/classes/LongDecimal.src/M000066.html +1 -1
- data/doc/classes/LongDecimal.src/M000067.html +1 -1
- data/doc/classes/LongDecimal.src/M000068.html +1 -1
- data/doc/classes/LongDecimal.src/M000069.html +1 -1
- data/doc/classes/LongDecimal.src/M000070.html +1 -1
- data/doc/classes/LongDecimal.src/M000071.html +6 -2
- data/doc/classes/LongDecimal.src/M000072.html +1 -1
- data/doc/classes/LongDecimal.src/M000073.html +1 -1
- data/doc/classes/LongDecimal.src/M000074.html +1 -1
- data/doc/classes/LongDecimal.src/M000075.html +1 -1
- data/doc/classes/LongDecimal.src/M000076.html +1 -1
- data/doc/classes/LongDecimal.src/M000077.html +1 -1
- data/doc/classes/LongDecimal.src/M000078.html +1 -1
- data/doc/classes/LongDecimal.src/M000079.html +1 -1
- data/doc/classes/LongDecimal.src/M000080.html +1 -1
- data/doc/classes/LongDecimal.src/M000081.html +1 -1
- data/doc/classes/LongDecimal.src/M000082.html +1 -1
- data/doc/classes/LongDecimal.src/M000083.html +1 -1
- data/doc/classes/LongDecimal.src/M000084.html +1 -1
- data/doc/classes/LongDecimal.src/M000085.html +1 -1
- data/doc/classes/LongDecimal.src/M000086.html +1 -1
- data/doc/classes/LongDecimal.src/M000087.html +1 -1
- data/doc/classes/LongDecimal.src/M000088.html +1 -1
- data/doc/classes/LongDecimal.src/M000089.html +1 -1
- data/doc/classes/LongDecimal.src/M000090.html +1 -1
- data/doc/classes/LongDecimal.src/M000091.html +1 -1
- data/doc/classes/LongDecimal.src/M000092.html +1 -1
- data/doc/classes/LongDecimal.src/M000093.html +1 -1
- data/doc/classes/LongDecimal.src/M000094.html +1 -1
- data/doc/classes/LongDecimal.src/M000095.html +1 -1
- data/doc/classes/LongDecimal.src/M000098.html +1 -1
- data/doc/classes/LongDecimal.src/M000099.html +1 -1
- data/doc/classes/LongDecimal.src/M000100.html +1 -1
- data/doc/classes/LongDecimal.src/M000101.html +1 -1
- data/doc/classes/LongDecimal.src/M000102.html +18 -0
- data/doc/classes/LongDecimal.src/M000103.html +18 -0
- data/doc/classes/LongDecimalBase.src/M000107.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000108.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000109.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000110.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000111.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000112.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000115.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000116.html +19 -0
- data/doc/classes/LongDecimalBase.src/M000117.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000013.html +13 -2
- data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000025.html +18 -1
- data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000030.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000031.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000034.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000035.html +18 -0
- data/doc/classes/LongDecimalRoundingMode.html +17 -2
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +17 -2
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000150.html +22 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000151.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000152.html +18 -0
- data/doc/classes/LongMath.src/M000118.html +1 -1
- data/doc/classes/LongMath.src/M000119.html +1 -1
- data/doc/classes/LongMath.src/M000120.html +1 -1
- data/doc/classes/LongMath.src/M000121.html +1 -1
- data/doc/classes/LongMath.src/M000122.html +1 -1
- data/doc/classes/LongMath.src/M000123.html +1 -1
- data/doc/classes/LongMath.src/M000124.html +1 -1
- data/doc/classes/LongMath.src/M000125.html +1 -1
- data/doc/classes/LongMath.src/M000126.html +1 -1
- data/doc/classes/LongMath.src/M000127.html +1 -1
- data/doc/classes/LongMath.src/M000128.html +1 -1
- data/doc/classes/LongMath.src/M000129.html +1 -1
- data/doc/classes/LongMath.src/M000130.html +1 -1
- data/doc/classes/LongMath.src/M000131.html +1 -1
- data/doc/classes/LongMath.src/M000132.html +1 -1
- data/doc/classes/LongMath.src/M000133.html +1 -1
- data/doc/classes/LongMath.src/M000134.html +1 -1
- data/doc/classes/LongMath.src/M000135.html +1 -1
- data/doc/classes/LongMath.src/M000136.html +1 -1
- data/doc/classes/LongMath.src/M000137.html +11 -3
- data/doc/classes/LongMath.src/M000138.html +2 -1
- data/doc/classes/LongMath.src/M000139.html +1 -1
- data/doc/classes/LongMath.src/M000140.html +1 -1
- data/doc/classes/LongMath.src/M000141.html +1 -1
- data/doc/classes/LongMath.src/M000142.html +2 -2
- data/doc/classes/LongMath.src/M000143.html +2 -2
- data/doc/classes/LongMath.src/M000144.html +3 -2
- data/doc/classes/LongMath.src/M000145.html +20 -10
- data/doc/classes/LongMath.src/M000146.html +3 -2
- data/doc/classes/LongMath.src/M000147.html +80 -0
- data/doc/classes/LongMath.src/M000148.html +63 -0
- data/doc/classes/LongMath/CacheKey.src/M000149.html +36 -0
- data/doc/classes/Numeric.src/M000104.html +23 -0
- data/doc/classes/Numeric.src/M000105.html +18 -0
- data/doc/classes/Rational.src/M000106.html +23 -0
- data/doc/created.rid +1 -1
- data/doc/files/lib/long-decimal_rb.html +189 -0
- data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
- data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
- data/doc/fr_method_index.html +20 -19
- data/lib/long-decimal.rb +105 -30
- data/test/testlongdecimal.rb +448 -3
- data/test/testlongdeclib.rb +127 -28
- data/test/testrandom.rb +35 -22
- data/version.rb +4 -4
- metadata +20 -2
data/test/testlongdeclib.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
#
|
3
3
|
# library for testlongdecimal.rb
|
4
4
|
#
|
5
|
-
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdeclib.rb,v 1.
|
6
|
-
# CVS-Label: $Name:
|
5
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdeclib.rb,v 1.7 2006/04/10 21:47:02 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_00 $
|
7
7
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
8
8
|
#
|
9
9
|
|
@@ -14,7 +14,7 @@ load "lib/long-decimal.rb"
|
|
14
14
|
#
|
15
15
|
module TestLongDecHelper
|
16
16
|
|
17
|
-
@RCS_ID='-$Id: testlongdeclib.rb,v 1.
|
17
|
+
@RCS_ID='-$Id: testlongdeclib.rb,v 1.7 2006/04/10 21:47:02 bk1 Exp $-'
|
18
18
|
|
19
19
|
|
20
20
|
#
|
@@ -30,6 +30,47 @@ module TestLongDecHelper
|
|
30
30
|
}
|
31
31
|
end
|
32
32
|
|
33
|
+
#
|
34
|
+
# convenience method for comparing two long-decimal numbers. true if and only if
|
35
|
+
# the second can be obtained from the first by rounding with
|
36
|
+
# ROUND_HALF_UP or ROUND_HALF_DOWN. If the digits that the first
|
37
|
+
# number has in excess to the second are 5000....., it is sufficient
|
38
|
+
# for sucess if either rounding up or rounding down yields the
|
39
|
+
# second number. In all other cases there is no difference between
|
40
|
+
# using ROUND_HALF_UP, ROUND_HALF_DOWN or ROUND_HALF_EVEN anyway, so
|
41
|
+
# one of these is used.
|
42
|
+
#
|
43
|
+
def assert_equal_rounded(expected, actual, message="")
|
44
|
+
_wrap_assertion {
|
45
|
+
full_message = build_message(message, "Expected <?> to match <?>", actual, expected)
|
46
|
+
assert_block(full_message) {
|
47
|
+
prec = actual.scale
|
48
|
+
ed = expected.round_to_scale(prec, LongMath::ROUND_HALF_FLOOR)
|
49
|
+
eu = expected.round_to_scale(prec, LongMath::ROUND_HALF_CEILING)
|
50
|
+
# puts("ed=#{ed} eu=#{eu} e=#{expected} a=#{actual}")
|
51
|
+
ed <= actual && actual <= eu
|
52
|
+
}
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# convenience method for comparing three long-decimal numbers. yd
|
58
|
+
# and yu should form a closed interval containing y. Length of
|
59
|
+
# interval is a unit at most.
|
60
|
+
#
|
61
|
+
def assert_small_interval(yd, yu, y, message="")
|
62
|
+
_wrap_assertion {
|
63
|
+
if (yu < yd) then
|
64
|
+
yd, yu = yu, yd
|
65
|
+
end
|
66
|
+
full_message = build_message(message, "Expected interval [<?>, <?>] to be one unit at most and to contain <?>", yd, yu, y)
|
67
|
+
assert_block(full_message) {
|
68
|
+
prec = y.scale
|
69
|
+
yd <= y && y <= yu && yu - yd <= y.unit
|
70
|
+
}
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
33
74
|
#
|
34
75
|
# convenience method for comparing Float with LongDecimal
|
35
76
|
# using a delta coming from these
|
@@ -64,7 +105,10 @@ module TestLongDecHelper
|
|
64
105
|
x = x.to_ld
|
65
106
|
# calculate y = exp(x)
|
66
107
|
# eprec = prec+1
|
67
|
-
y
|
108
|
+
y = LongMath.exp(x, prec)
|
109
|
+
yy = LongMath.exp(x, prec+10)
|
110
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
111
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
68
112
|
|
69
113
|
# compare y against z = exp(x) calculated using regular floating point arithmetic
|
70
114
|
z = Math.exp(x.to_f)
|
@@ -93,8 +137,9 @@ module TestLongDecHelper
|
|
93
137
|
# check by doing calculation with different internal rounding modes. They should not differ.
|
94
138
|
yd = LongMath.exp_internal(x, prec, nil, nil, nil, nil, LongDecimal::ROUND_DOWN)
|
95
139
|
yu = LongMath.exp_internal(x, prec, nil, nil, nil, nil, LongDecimal::ROUND_UP)
|
96
|
-
assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
97
|
-
assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(y -yu).to_f.to_s}")
|
140
|
+
# assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
141
|
+
# assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(y -yu).to_f.to_s}")
|
142
|
+
assert_small_interval(yd, yu, y, "the result y/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
98
143
|
end
|
99
144
|
|
100
145
|
#
|
@@ -129,6 +174,9 @@ module TestLongDecHelper
|
|
129
174
|
#
|
130
175
|
def check_power_xint(x, y, prec)
|
131
176
|
|
177
|
+
print "."
|
178
|
+
$stdout.flush
|
179
|
+
|
132
180
|
xi = x.to_i
|
133
181
|
x = x.to_ld()
|
134
182
|
y = y.to_ld()
|
@@ -147,6 +195,9 @@ module TestLongDecHelper
|
|
147
195
|
#
|
148
196
|
def check_power_yint(x, y, prec)
|
149
197
|
|
198
|
+
print "."
|
199
|
+
$stdout.flush
|
200
|
+
|
150
201
|
yi = y.to_i
|
151
202
|
x = x.to_ld
|
152
203
|
y = y.to_ld
|
@@ -172,20 +223,29 @@ module TestLongDecHelper
|
|
172
223
|
print ","
|
173
224
|
$stdout.flush
|
174
225
|
|
226
|
+
assert(prec > 0, "does not work for prec=0")
|
227
|
+
|
175
228
|
# make sure x is LongDecimal
|
176
229
|
x0 = x
|
177
230
|
x = x.to_ld
|
178
231
|
# calculate y = log(x)
|
179
|
-
y
|
232
|
+
y = LongMath.log(x, prec)
|
233
|
+
yy = LongMath.log(x, prec+10)
|
234
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
235
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
180
236
|
|
181
237
|
# compare y against z = exp(x) calculated using regular floating
|
182
238
|
# point arithmetic
|
183
239
|
if (x <= LongMath::MAX_FLOATABLE) then
|
184
240
|
xf = x.to_f
|
185
241
|
if (xf > 0) then
|
186
|
-
|
242
|
+
xf = x.to_f
|
243
|
+
z = Math.log(xf)
|
187
244
|
zl = z.to_ld(y.scale)
|
188
|
-
|
245
|
+
df = [ 1e-14, z.abs / 1e10 ].max
|
246
|
+
dl = y.unit
|
247
|
+
# delta = [ y.unit, z.abs / divisor + summand ].max
|
248
|
+
delta = [ df, dl ].max
|
189
249
|
assert((y - zl).abs <= delta, "y=#{y.to_s} (#{y.to_f}) and z=#{z.to_s} (#{zl.to_f}) should be almost equal (d=#{delta.inspect} x=#{x} y=#{y})")
|
190
250
|
end
|
191
251
|
end
|
@@ -215,15 +275,19 @@ module TestLongDecHelper
|
|
215
275
|
end
|
216
276
|
z = LongMath.exp(y, eprec)
|
217
277
|
u = z.unit
|
218
|
-
|
219
|
-
|
278
|
+
v = y.unit
|
279
|
+
# delta = (u + u.move_point_left(1)) * df
|
280
|
+
delta = [ v * z, u * df ].max
|
281
|
+
# puts("x=#{x.to_s} and z=#{z.to_s} should be almost equal (#{(x-z).abs} < d=#{delta} y=#{y.to_s} eprec=#{eprec} prec=#{prec} u=#{u.inspect} v=#{v.inspect} df=#{df})")
|
282
|
+
assert((x - z).abs <= delta, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (#{(x-z).abs} < d=#{delta} y=#{y.to_s} eprec=#{eprec} prec=#{prec})")
|
220
283
|
end
|
221
284
|
|
222
285
|
# check by doing calculation with different internal rounding modes. They should not differ.
|
223
286
|
yd = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_DOWN)
|
224
287
|
yu = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_UP)
|
225
|
-
assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
226
|
-
assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(y -yu).to_f.to_s}")
|
288
|
+
# assert_equal(yd, yu, "the result yd/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
289
|
+
# assert_equal(y, yu, "the result y/yu should not depend on the internal rounding mode yd=#{yd} yu=#{yu} y=#{y} p=#{prec} d=#{(y -yu).to_f.to_s}")
|
290
|
+
assert_small_interval(yd, yu, y, "the result y/yu should not depend on the internal rounding mode x0=#{x0} x=#{x} p=#{prec} d=#{(yd-yu).to_f.to_s}")
|
227
291
|
end
|
228
292
|
|
229
293
|
#
|
@@ -283,20 +347,32 @@ module TestLongDecHelper
|
|
283
347
|
#
|
284
348
|
def check_log10_floated(x, prec)
|
285
349
|
|
350
|
+
print ","
|
351
|
+
$stdout.flush
|
352
|
+
|
286
353
|
# make sure x is LongDecimal
|
287
354
|
x0 = x
|
288
355
|
x = x.to_ld
|
289
356
|
# calculate y = log10(x)
|
290
|
-
y
|
357
|
+
y = LongMath.log10(x, prec)
|
358
|
+
yy = LongMath.log10(x, prec+10)
|
359
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
360
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
291
361
|
|
292
362
|
# compare y against z = log10(x) calculated using regular floating
|
293
363
|
# point arithmetic
|
294
364
|
if (x <= LongMath::MAX_FLOATABLE) then
|
295
365
|
xf = x.to_f
|
296
366
|
if (xf > 0) then
|
367
|
+
xf = x.to_f
|
297
368
|
z = Math.log(x.to_f) / Math.log(10)
|
298
369
|
yf = y.to_f
|
299
|
-
|
370
|
+
zl = z.to_ld(y.scale)
|
371
|
+
df = [ 1e-13, z.abs / 1e10 ].max
|
372
|
+
dl = y.unit
|
373
|
+
delta = [ df, dl ].max
|
374
|
+
# assert((yf - z).abs / [yf.abs, z.abs, Float::MIN].max < 1e-9, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal x=#{x}")
|
375
|
+
assert((yf - z).abs < delta, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal (x=#{x} delta=#{delta}")
|
300
376
|
end
|
301
377
|
end
|
302
378
|
|
@@ -317,10 +393,14 @@ module TestLongDecHelper
|
|
317
393
|
eprec = [ eprec - l10, 0 ].max
|
318
394
|
end
|
319
395
|
|
320
|
-
z
|
321
|
-
|
322
|
-
|
323
|
-
|
396
|
+
z = LongMath.power(10.to_ld, y, eprec)
|
397
|
+
zz = LongMath.exp10(y, eprec)
|
398
|
+
u = z.unit
|
399
|
+
v = y.unit
|
400
|
+
assert((zz - z).abs <= u, "zz=#{zz.to_s} and z=#{z.to_s} should be almost equal (y=#{y.to_s} eprec=#{eprec} prec=#{prec})")
|
401
|
+
delta = [ v*z*LongMath::LOG10*1.2, u * 1.1 ].max
|
402
|
+
assert((x - z).abs <= delta, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (y=#{y.to_s} eprec=#{eprec} prec=#{prec} delta=#{delta})")
|
403
|
+
# assert((x - z).abs <= z.unit, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (y=#{y.to_s} eprec=#{eprec} prec=#{prec})")
|
324
404
|
end
|
325
405
|
|
326
406
|
end
|
@@ -346,20 +426,32 @@ module TestLongDecHelper
|
|
346
426
|
#
|
347
427
|
def check_log2_floated(x, prec)
|
348
428
|
|
429
|
+
print ","
|
430
|
+
$stdout.flush
|
431
|
+
|
349
432
|
# make sure x is LongDecimal
|
350
433
|
x0 = x
|
351
434
|
x = x.to_ld
|
352
435
|
# calculate y = log2(x)
|
353
|
-
y
|
436
|
+
y = LongMath.log2(x, prec)
|
437
|
+
yy = LongMath.log2(x, prec+10)
|
438
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
439
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
354
440
|
|
355
441
|
# compare y against z = log2(x) calculated using regular floating
|
356
442
|
# point arithmetic
|
357
443
|
if (x <= LongMath::MAX_FLOATABLE) then
|
358
444
|
xf = x.to_f
|
359
445
|
if (xf > 0) then
|
360
|
-
|
446
|
+
xf = x.to_f
|
447
|
+
z = Math.log(xf) / Math.log(2)
|
361
448
|
yf = y.to_f
|
362
|
-
|
449
|
+
zl = z.to_ld(y.scale)
|
450
|
+
df = [ 1e-13, z.abs / 1e10 ].max
|
451
|
+
dl = y.unit
|
452
|
+
delta = [ df, dl ].max
|
453
|
+
# assert((yf - z).abs / [yf.abs, z.abs, Float::MIN].max < 1e-9, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal x=#{x}")
|
454
|
+
assert((yf - z).abs < delta, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal (x=#{x} delta=#{delta}")
|
363
455
|
end
|
364
456
|
end
|
365
457
|
|
@@ -380,10 +472,13 @@ module TestLongDecHelper
|
|
380
472
|
eprec = [ eprec - l10, 0 ].max
|
381
473
|
end
|
382
474
|
|
383
|
-
z
|
384
|
-
|
385
|
-
|
386
|
-
|
475
|
+
z = LongMath.power(2.to_ld, y, eprec)
|
476
|
+
zz = LongMath.exp2(y, eprec)
|
477
|
+
u = z.unit
|
478
|
+
v = y.unit
|
479
|
+
assert((zz - z).abs <= u, "zz=#{zz.to_s} and z=#{z.to_s} should be almost equal (y=#{y.to_s} eprec=#{eprec} prec=#{prec})")
|
480
|
+
delta = [ v*z, u ].max
|
481
|
+
assert((x - z).abs <= delta, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (y=#{y.to_s} eprec=#{eprec} prec=#{prec} delta=#{delta})")
|
387
482
|
end
|
388
483
|
|
389
484
|
end
|
@@ -459,7 +554,11 @@ module TestLongDecHelper
|
|
459
554
|
# helper method of test_sqrt
|
460
555
|
#
|
461
556
|
def check_sqrt(x, scale, mode, su0, su1, str)
|
462
|
-
y
|
557
|
+
y = x.sqrt(scale, mode)
|
558
|
+
if (mode == LongMath::ROUND_HALF_UP || mode == LongMath::ROUND_HALF_DOWN || mode == LongMath::ROUND_HALF_EVEN)
|
559
|
+
yy = x.sqrt(scale+10, mode)
|
560
|
+
assert_equal(yy.round_to_scale(y.scale, mode), y, "x=#{x} y=#{y} yy=#{yy}")
|
561
|
+
end
|
463
562
|
z0 = (y+su0*y.unit).square
|
464
563
|
z1 = (y+su1*y.unit).square
|
465
564
|
assert(0 <= y.sign, "sqrt must be >= 0" + str)
|
@@ -476,7 +575,7 @@ module TestLongDecHelper
|
|
476
575
|
z1 = y.succ.square
|
477
576
|
assert(0 <= y.sign, "sqrt must be >= 0" + str)
|
478
577
|
assert(z0 <= x && x < z1, "y=#{y}=sqrt(#{x}) and x in [#{z0}, #{z1}) " + str)
|
479
|
-
assert((x - z0 - r).zero?, "x=y*y+r x=#{x} z0=#{z0} z1=#{z1} r=#{r} total=#{x - z0 - r} " + str)
|
578
|
+
assert((x - z0 - r).zero?, "x=y*y+r x=#{x} z0=#{z0} z1=#{z1} y=#{y} r=#{r} total=#{x - z0 - r} " + str)
|
480
579
|
r
|
481
580
|
end
|
482
581
|
|
data/test/testrandom.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
#
|
3
3
|
# testlongdecimal.rb -- runit test for long-decimal.rb
|
4
4
|
#
|
5
|
-
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testrandom.rb,v 1.
|
6
|
-
# CVS-Label: $Name:
|
5
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testrandom.rb,v 1.5 2006/04/10 21:47:02 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_00 $
|
7
7
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
8
8
|
#
|
9
9
|
|
@@ -20,15 +20,35 @@ load "test/testlongdeclib.rb"
|
|
20
20
|
class TestLongDecimal_class < RUNIT::TestCase
|
21
21
|
include TestLongDecHelper
|
22
22
|
|
23
|
-
@RCS_ID='-$Id: testrandom.rb,v 1.
|
23
|
+
@RCS_ID='-$Id: testrandom.rb,v 1.5 2006/04/10 21:47:02 bk1 Exp $-'
|
24
24
|
|
25
|
-
|
25
|
+
# for how many seconds should this test run? change to different
|
26
|
+
# value on demand
|
27
|
+
@@duration = 1000000
|
26
28
|
|
27
29
|
@@r1 = Crypt::ISAAC.new
|
28
30
|
@@r2 = Crypt::ISAAC.new
|
29
31
|
@@r3 = Crypt::ISAAC.new
|
30
32
|
@@r4 = Crypt::ISAAC.new
|
31
33
|
|
34
|
+
def check_exp_log_rand(x, eprec, lprec)
|
35
|
+
check_exp_log_half(x, eprec, lprec)
|
36
|
+
xx = x.inverse.to_ld(x.scale*2)
|
37
|
+
check_exp_log_half(xx, eprec, lprec)
|
38
|
+
end
|
39
|
+
|
40
|
+
def check_exp_log_half(x, eprec, lprec)
|
41
|
+
if (x <= LongMath::MAX_EXP_ABLE)
|
42
|
+
check_exp_floated(x, eprec)
|
43
|
+
check_exp_floated(-x, eprec)
|
44
|
+
end
|
45
|
+
if (x > 0)
|
46
|
+
check_log_floated(x, lprec)
|
47
|
+
check_log2_floated(x, lprec)
|
48
|
+
check_log10_floated(x, lprec)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
32
52
|
#
|
33
53
|
# test the calculation of the exponential function
|
34
54
|
#
|
@@ -38,30 +58,23 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
38
58
|
while (true) do
|
39
59
|
d = Time.new - t0
|
40
60
|
break if d >= @@duration
|
41
|
-
x0 = @@r1.rand(
|
61
|
+
x0 = @@r1.rand(1000)
|
42
62
|
x1 = @@r2.rand(1000)
|
43
63
|
x2 = @@r2.rand(100)+3
|
44
64
|
x3 = @@r3.rand(1000)
|
45
65
|
x4 = @@r3.rand(100)+4
|
46
66
|
x5 = @@r4.rand(1000)
|
47
67
|
x6 = @@r4.rand(100)+5
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
if (x > 0)
|
59
|
-
check_log_floated(x, prec)
|
60
|
-
end
|
61
|
-
if (xx > 0)
|
62
|
-
check_log_floated(xx, prec)
|
63
|
-
end
|
64
|
-
sprec = prec+(x.scale>>1)
|
68
|
+
xs = LongDecimal(x1, x2) + LongDecimal(x3, x4) + LongDecimal(x5, x6)
|
69
|
+
xm = 1 + xs
|
70
|
+
x = x0 + xs
|
71
|
+
eprec = @@r1.rand(120)
|
72
|
+
lprec = eprec+1
|
73
|
+
sprec = eprec+((x.scale+1)>>1)
|
74
|
+
puts("cnt=#{cnt} x=#{x} sc=#{x.scale} ep=#{eprec} lp=#{lprec} sp=#{sprec}\n")
|
75
|
+
check_exp_log_rand(xs, eprec, lprec)
|
76
|
+
check_exp_log_rand(xm, eprec, lprec)
|
77
|
+
check_exp_log_rand(x , eprec, lprec)
|
65
78
|
check_sqrt_with_remainder(x, sprec, "x=#{x} p=#{sprec}")
|
66
79
|
cnt += 1
|
67
80
|
end
|
data/version.rb
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
#
|
4
4
|
# version.rb -- extract version information from files
|
5
5
|
#
|
6
|
-
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/version.rb,v 1.
|
7
|
-
# CVS-Label: $Name:
|
6
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/version.rb,v 1.6 2006/04/11 19:45:40 bk1 Exp $
|
7
|
+
# CVS-Label: $Name: ALPHA_01_00 $
|
8
8
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
9
9
|
#
|
10
10
|
|
@@ -23,8 +23,8 @@ ARGV.each do |file|
|
|
23
23
|
end
|
24
24
|
|
25
25
|
str = ""
|
26
|
-
if name =~ /
|
27
|
-
str = sprintf("0.%02d.%02d", $
|
26
|
+
if name =~ /(PRE_ALPHA|ALPHA|BETA)_(\d+)_(\d+)/ then
|
27
|
+
str = sprintf("0.%02d.%02d", $2.to_i, $3.to_i)
|
28
28
|
else
|
29
29
|
str = version
|
30
30
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: long-decimal
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.00
|
7
|
-
date: 2006-04-
|
6
|
+
version: 0.01.00
|
7
|
+
date: 2006-04-11 00:00:00 +02:00
|
8
8
|
summary: LongDecimal for numbers with fixed point
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- doc/dot/f_0.png
|
55
55
|
- doc/files/lib
|
56
56
|
- doc/files/lib/long-decimal_rb.src
|
57
|
+
- doc/files/lib/long-decimal_rb.html
|
57
58
|
- doc/files/lib/long-decimal_rb.src/M000001.html
|
58
59
|
- doc/files/lib/long-decimal_rb.src/M000002.html
|
59
60
|
- doc/classes/LongDecimal.src
|
@@ -107,7 +108,9 @@ files:
|
|
107
108
|
- doc/classes/LongDecimal.src/M000042.html
|
108
109
|
- doc/classes/LongDecimal.src/M000101.html
|
109
110
|
- doc/classes/LongDecimal.src/M000043.html
|
111
|
+
- doc/classes/LongDecimal.src/M000102.html
|
110
112
|
- doc/classes/LongDecimal.src/M000044.html
|
113
|
+
- doc/classes/LongDecimal.src/M000103.html
|
111
114
|
- doc/classes/LongDecimal.src/M000045.html
|
112
115
|
- doc/classes/LongDecimal.src/M000046.html
|
113
116
|
- doc/classes/LongDecimal.src/M000047.html
|
@@ -142,9 +145,12 @@ files:
|
|
142
145
|
- doc/classes/Numeric.src/M000100.html
|
143
146
|
- doc/classes/Numeric.src/M000102.html
|
144
147
|
- doc/classes/Numeric.src/M000103.html
|
148
|
+
- doc/classes/Numeric.src/M000104.html
|
149
|
+
- doc/classes/Numeric.src/M000105.html
|
145
150
|
- doc/classes/Rational.src/M000101.html
|
146
151
|
- doc/classes/Rational.src/M000103.html
|
147
152
|
- doc/classes/Rational.src/M000104.html
|
153
|
+
- doc/classes/Rational.src/M000106.html
|
148
154
|
- doc/classes/LongDecimalQuot.src/M000008.html
|
149
155
|
- doc/classes/LongDecimalQuot.src/M000009.html
|
150
156
|
- doc/classes/LongDecimalQuot.src/M000010.html
|
@@ -167,8 +173,12 @@ files:
|
|
167
173
|
- doc/classes/LongDecimalQuot.src/M000027.html
|
168
174
|
- doc/classes/LongDecimalQuot.src/M000028.html
|
169
175
|
- doc/classes/LongDecimalQuot.src/M000029.html
|
176
|
+
- doc/classes/LongDecimalQuot.src/M000030.html
|
177
|
+
- doc/classes/LongDecimalQuot.src/M000031.html
|
170
178
|
- doc/classes/LongDecimalQuot.src/M000032.html
|
171
179
|
- doc/classes/LongDecimalQuot.src/M000033.html
|
180
|
+
- doc/classes/LongDecimalQuot.src/M000034.html
|
181
|
+
- doc/classes/LongDecimalQuot.src/M000035.html
|
172
182
|
- doc/classes/LongDecimalQuot.src/M000003.html
|
173
183
|
- doc/classes/LongDecimalQuot.src/M000004.html
|
174
184
|
- doc/classes/LongDecimalQuot.src/M000005.html
|
@@ -189,11 +199,14 @@ files:
|
|
189
199
|
- doc/classes/LongDecimalBase.src/M000113.html
|
190
200
|
- doc/classes/LongDecimalBase.src/M000114.html
|
191
201
|
- doc/classes/LongDecimalBase.src/M000115.html
|
202
|
+
- doc/classes/LongDecimalBase.src/M000116.html
|
203
|
+
- doc/classes/LongDecimalBase.src/M000117.html
|
192
204
|
- doc/classes/LongMath/CacheKey.html
|
193
205
|
- doc/classes/LongMath/CacheKey.src
|
194
206
|
- doc/classes/LongMath/CacheKey.src/M000140.html
|
195
207
|
- doc/classes/LongMath/CacheKey.src/M000145.html
|
196
208
|
- doc/classes/LongMath/CacheKey.src/M000147.html
|
209
|
+
- doc/classes/LongMath/CacheKey.src/M000149.html
|
197
210
|
- doc/classes/LongMath.src/M000135.html
|
198
211
|
- doc/classes/LongMath.src/M000136.html
|
199
212
|
- doc/classes/LongMath.src/M000137.html
|
@@ -206,6 +219,8 @@ files:
|
|
206
219
|
- doc/classes/LongMath.src/M000144.html
|
207
220
|
- doc/classes/LongMath.src/M000145.html
|
208
221
|
- doc/classes/LongMath.src/M000146.html
|
222
|
+
- doc/classes/LongMath.src/M000147.html
|
223
|
+
- doc/classes/LongMath.src/M000148.html
|
209
224
|
- doc/classes/LongMath.src/M000112.html
|
210
225
|
- doc/classes/LongMath.src/M000113.html
|
211
226
|
- doc/classes/LongMath.src/M000114.html
|
@@ -240,6 +255,9 @@ files:
|
|
240
255
|
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000147.html
|
241
256
|
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000148.html
|
242
257
|
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000149.html
|
258
|
+
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000150.html
|
259
|
+
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000151.html
|
260
|
+
- doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000152.html
|
243
261
|
- lib/long-decimal.rb
|
244
262
|
- test/testlongdecimal.rb
|
245
263
|
- test/testlongdeclib.rb
|