long-decimal 0.01.00 → 0.01.01
Sign up to get free protection for your applications and to get access to all the features.
- data/README +6 -3
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.html +207 -189
- 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 +15 -2
- data/doc/classes/LongDecimal.src/M000051.html +1 -1
- data/doc/classes/LongDecimal.src/M000052.html +2 -2
- 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 +4 -8
- data/doc/classes/LongDecimal.src/M000067.html +6 -7
- data/doc/classes/LongDecimal.src/M000068.html +5 -5
- data/doc/classes/LongDecimal.src/M000069.html +6 -6
- data/doc/classes/LongDecimal.src/M000070.html +9 -4
- data/doc/classes/LongDecimal.src/M000071.html +4 -19
- data/doc/classes/LongDecimal.src/M000072.html +15 -5
- data/doc/classes/LongDecimal.src/M000073.html +7 -7
- data/doc/classes/LongDecimal.src/M000074.html +7 -18
- data/doc/classes/LongDecimal.src/M000075.html +20 -7
- data/doc/classes/LongDecimal.src/M000076.html +8 -5
- data/doc/classes/LongDecimal.src/M000077.html +5 -9
- data/doc/classes/LongDecimal.src/M000078.html +5 -5
- data/doc/classes/LongDecimal.src/M000079.html +5 -5
- data/doc/classes/LongDecimal.src/M000080.html +9 -4
- data/doc/classes/LongDecimal.src/M000081.html +4 -7
- data/doc/classes/LongDecimal.src/M000082.html +4 -4
- data/doc/classes/LongDecimal.src/M000083.html +7 -4
- data/doc/classes/LongDecimal.src/M000084.html +4 -4
- data/doc/classes/LongDecimal.src/M000085.html +4 -9
- data/doc/classes/LongDecimal.src/M000086.html +6 -6
- data/doc/classes/LongDecimal.src/M000087.html +9 -5
- data/doc/classes/LongDecimal.src/M000088.html +4 -8
- data/doc/classes/LongDecimal.src/M000089.html +9 -4
- data/doc/classes/LongDecimal.src/M000090.html +4 -4
- data/doc/classes/LongDecimal.src/M000091.html +4 -4
- data/doc/classes/LongDecimal.src/M000092.html +4 -4
- data/doc/classes/LongDecimal.src/M000093.html +4 -59
- data/doc/classes/LongDecimal.src/M000094.html +59 -4
- data/doc/classes/LongDecimal.src/M000095.html +4 -4
- data/doc/classes/LongDecimal.src/M000096.html +4 -5
- data/doc/classes/LongDecimal.src/M000099.html +5 -5
- data/doc/classes/LongDecimal.src/M000100.html +5 -4
- data/doc/classes/LongDecimal.src/M000101.html +4 -4
- data/doc/classes/LongDecimal.src/M000102.html +4 -4
- data/doc/classes/LongDecimal.src/M000103.html +4 -4
- data/doc/classes/LongDecimalBase.html +53 -53
- data/doc/classes/LongDecimalBase.src/M000108.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000109.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000110.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000111.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000112.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000113.html +9 -9
- data/doc/classes/LongDecimalBase.src/M000116.html +9 -5
- data/doc/classes/LongDecimalBase.src/M000117.html +5 -4
- data/doc/classes/LongDecimalQuot.html +1 -1
- 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 +2 -2
- data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
- 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 +1 -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 +1 -1
- data/doc/classes/LongDecimalQuot.src/M000031.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000034.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000035.html +1 -1
- data/doc/classes/LongDecimalRoundingMode.html +6 -1
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +37 -16
- data/doc/classes/LongMath.html +246 -161
- data/doc/classes/LongMath.src/M000119.html +5 -4
- data/doc/classes/LongMath.src/M000120.html +4 -4
- data/doc/classes/LongMath.src/M000121.html +4 -5
- data/doc/classes/LongMath.src/M000122.html +5 -4
- data/doc/classes/LongMath.src/M000123.html +4 -18
- data/doc/classes/LongMath.src/M000124.html +14 -14
- data/doc/classes/LongMath.src/M000125.html +18 -5
- data/doc/classes/LongMath.src/M000126.html +5 -29
- data/doc/classes/LongMath.src/M000127.html +29 -5
- data/doc/classes/LongMath.src/M000128.html +5 -57
- data/doc/classes/LongMath.src/M000129.html +55 -19
- data/doc/classes/LongMath.src/M000130.html +20 -35
- data/doc/classes/LongMath.src/M000131.html +36 -6
- data/doc/classes/LongMath.src/M000132.html +6 -33
- data/doc/classes/LongMath.src/M000133.html +26 -44
- data/doc/classes/LongMath.src/M000134.html +49 -5
- data/doc/classes/LongMath.src/M000135.html +7 -4
- data/doc/classes/LongMath.src/M000136.html +4 -4
- data/doc/classes/LongMath.src/M000137.html +4 -72
- data/doc/classes/LongMath.src/M000138.html +67 -39
- data/doc/classes/LongMath.src/M000139.html +44 -4
- data/doc/classes/LongMath.src/M000140.html +4 -4
- data/doc/classes/LongMath.src/M000141.html +4 -6
- data/doc/classes/LongMath.src/M000142.html +4 -18
- data/doc/classes/LongMath.src/M000143.html +8 -7
- data/doc/classes/LongMath.src/M000144.html +10 -35
- data/doc/classes/LongMath.src/M000145.html +23 -202
- data/doc/classes/LongMath.src/M000146.html +322 -4
- data/doc/classes/LongMath.src/M000147.html +22 -63
- data/doc/classes/LongMath.src/M000148.html +65 -33
- data/doc/classes/LongMath/CacheKey.html +5 -5
- data/doc/classes/Numeric.html +11 -11
- data/doc/classes/Numeric.src/M000105.html +9 -4
- data/doc/classes/Rational.html +6 -6
- data/doc/created.rid +1 -1
- data/doc/files/lib/long-decimal_rb.html +2 -2
- 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 +102 -95
- data/lib/long-decimal.rb +206 -49
- data/test/testlongdecimal.rb +736 -21
- data/test/testlongdeclib.rb +136 -25
- data/test/testrandlib.rb +87 -0
- data/test/testrandom.rb +30 -45
- data/test/testrandpower.rb +72 -0
- metadata +4 -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.15 2006/05/01 12:22:12 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_01 $
|
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.15 2006/05/01 12:22:12 bk1 Exp $-'
|
18
18
|
|
19
19
|
|
20
20
|
#
|
@@ -42,13 +42,19 @@ module TestLongDecHelper
|
|
42
42
|
#
|
43
43
|
def assert_equal_rounded(expected, actual, message="")
|
44
44
|
_wrap_assertion {
|
45
|
-
|
45
|
+
lhs = (expected - actual).abs()*2000
|
46
|
+
rhs = actual.unit.abs()*1001
|
47
|
+
full_message = build_message(message, "Expected <?> to match <?> (lhs=#{lhs} rhs=#{rhs})", actual, expected)
|
46
48
|
assert_block(full_message) {
|
47
|
-
prec = actual.scale
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
# prec = actual.scale
|
50
|
+
# ed = expected.round_to_scale(prec, LongMath::ROUND_HALF_FLOOR)
|
51
|
+
# eu = expected.round_to_scale(prec, LongMath::ROUND_HALF_CEILING)
|
52
|
+
# # puts("ed=#{ed} eu=#{eu} e=#{expected} a=#{actual}")
|
53
|
+
# ed <= actual && actual <= eu
|
54
|
+
|
55
|
+
# (expected - actual).abs < (actual.unit()/2)*(1001/1000)
|
56
|
+
# (expected - actual).abs()*2000 < actual.unit()*1001
|
57
|
+
lhs < rhs
|
52
58
|
}
|
53
59
|
}
|
54
60
|
end
|
@@ -61,12 +67,12 @@ module TestLongDecHelper
|
|
61
67
|
def assert_small_interval(yd, yu, y, message="")
|
62
68
|
_wrap_assertion {
|
63
69
|
if (yu < yd) then
|
64
|
-
|
70
|
+
yd, yu = yu, yd
|
65
71
|
end
|
66
72
|
full_message = build_message(message, "Expected interval [<?>, <?>] to be one unit at most and to contain <?>", yd, yu, y)
|
67
73
|
assert_block(full_message) {
|
68
74
|
prec = y.scale
|
69
|
-
|
75
|
+
yd <= y && y <= yu && yu - yd <= y.unit
|
70
76
|
}
|
71
77
|
}
|
72
78
|
end
|
@@ -168,6 +174,99 @@ module TestLongDecHelper
|
|
168
174
|
|
169
175
|
end
|
170
176
|
|
177
|
+
#
|
178
|
+
# helper method for test_exp2
|
179
|
+
# tests if exp2(x) with precision prec is calculated correctly
|
180
|
+
#
|
181
|
+
def check_exp2_floated(x, prec)
|
182
|
+
|
183
|
+
print "."
|
184
|
+
$stdout.flush
|
185
|
+
|
186
|
+
# make sure x is LongDecimal
|
187
|
+
x0 = x
|
188
|
+
x = x.to_ld
|
189
|
+
# calculate y = exp(x)
|
190
|
+
# eprec = prec+1
|
191
|
+
y = LongMath.exp2(x, prec)
|
192
|
+
yy = LongMath.exp2(x, prec+10)
|
193
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
194
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
195
|
+
|
196
|
+
# compare y against z = exp(x) calculated using regular floating point arithmetic
|
197
|
+
zf = 2.0 ** (x.to_f)
|
198
|
+
yf = y.to_f
|
199
|
+
assert((yf - zf).abs <= [ y.unit, zf.abs / 1e9 ].max, "y=#{yf.to_s} and z=#{zf.to_s} should be almost equal x=#{x}")
|
200
|
+
|
201
|
+
# check by taking log(exp(x))
|
202
|
+
# we have to take into account that we might not have enough
|
203
|
+
# significant digits, so we have to go down with the precision
|
204
|
+
if (y > 0) then
|
205
|
+
lprec = prec - 1
|
206
|
+
if (y < 1) then
|
207
|
+
l10 = (Math.log(y.to_f) / Math.log(10)).round
|
208
|
+
lprec += l10
|
209
|
+
end
|
210
|
+
df = 1
|
211
|
+
if (lprec < 0)
|
212
|
+
df += lprec.abs
|
213
|
+
lprec = 0
|
214
|
+
end
|
215
|
+
z = LongMath.log2(y, lprec)
|
216
|
+
delta = z.unit * df
|
217
|
+
assert((x - z).abs <= delta, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (#{(x-z).abs.inspect} < d=#{delta.inspect} y=#{y.to_s} lprec=#{lprec} prec=#{prec})")
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
#
|
224
|
+
# helper method for test_exp10
|
225
|
+
# tests if exp10(x) with precision prec is calculated correctly
|
226
|
+
#
|
227
|
+
def check_exp10_floated(x, prec)
|
228
|
+
|
229
|
+
print "."
|
230
|
+
$stdout.flush
|
231
|
+
|
232
|
+
# make sure x is LongDecimal
|
233
|
+
x0 = x
|
234
|
+
x = x.to_ld
|
235
|
+
# calculate y = exp(x)
|
236
|
+
# eprec = prec+1
|
237
|
+
y = LongMath.exp10(x, prec)
|
238
|
+
yy = LongMath.exp10(x, prec+10)
|
239
|
+
# assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
240
|
+
assert_equal_rounded(yy, y, "x=#{x} y=#{y} yy=#{yy}")
|
241
|
+
|
242
|
+
if (y.abs < LongMath::MAX_FLOATABLE) then
|
243
|
+
# compare y against z = exp(x) calculated using regular floating point arithmetic
|
244
|
+
zf = 10.0 ** (x.to_f)
|
245
|
+
yf = y.to_f
|
246
|
+
assert((yf - zf).abs <= [ y.unit, zf.abs / 1e9 ].max, "y=#{yf.to_s} and z=#{zf.to_s} should be almost equal x=#{x}")
|
247
|
+
end
|
248
|
+
|
249
|
+
# check by taking log(exp(x))
|
250
|
+
# we have to take into account that we might not have enough
|
251
|
+
# significant digits, so we have to go down with the precision
|
252
|
+
if (y > 0) then
|
253
|
+
lprec = prec - 1
|
254
|
+
if (y < 1) then
|
255
|
+
l10 = (Math.log(y.to_f) / Math.log(10)).round
|
256
|
+
lprec += l10
|
257
|
+
end
|
258
|
+
df = 1
|
259
|
+
if (lprec < 0)
|
260
|
+
df += lprec.abs
|
261
|
+
lprec = 0
|
262
|
+
end
|
263
|
+
z = LongMath.log10(y, lprec)
|
264
|
+
delta = z.unit * df
|
265
|
+
assert((x - z).abs <= delta, "x=#{x.to_s} and z=#{z.to_s} should be almost equal (#{(x-z).abs.inspect} < d=#{delta.inspect} y=#{y.to_s} lprec=#{lprec} prec=#{prec})")
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
269
|
+
|
171
270
|
#
|
172
271
|
# helper method for test_lm_power_xint
|
173
272
|
# tests if exp(x) with precision prec is calculated correctly
|
@@ -283,11 +382,14 @@ module TestLongDecHelper
|
|
283
382
|
end
|
284
383
|
|
285
384
|
# check by doing calculation with different internal rounding modes. They should not differ.
|
286
|
-
yd = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_DOWN)
|
287
|
-
yu = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_UP)
|
385
|
+
# yd = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_DOWN)
|
386
|
+
# yu = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_UP)
|
387
|
+
yd = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_FLOOR)
|
388
|
+
yu = LongMath.log_internal(x, prec, nil, nil, LongDecimal::ROUND_CEILING)
|
288
389
|
# 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
390
|
# 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
391
|
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}")
|
392
|
+
return y
|
291
393
|
end
|
292
394
|
|
293
395
|
#
|
@@ -296,7 +398,11 @@ module TestLongDecHelper
|
|
296
398
|
#
|
297
399
|
def check_power_floated(x, y, prec)
|
298
400
|
|
299
|
-
|
401
|
+
print "."
|
402
|
+
# print("\nstart: check_power_floated: x=#{x} y=#{y} prec=#{prec}")
|
403
|
+
# t0 = Time.new
|
404
|
+
$stdout.flush
|
405
|
+
|
300
406
|
# make sure x and y are LongDecimal
|
301
407
|
x0 = x
|
302
408
|
x = x.to_ld
|
@@ -305,11 +411,13 @@ module TestLongDecHelper
|
|
305
411
|
# calculate z = x**y
|
306
412
|
z = LongMath.power(x, y, prec)
|
307
413
|
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
414
|
+
if (z.abs < LongMath::MAX_FLOATABLE)
|
415
|
+
# compare y against w = x**y calculated using regular floating point arithmetic
|
416
|
+
w = (x.to_f) ** (y.to_f)
|
417
|
+
zf = z.to_f
|
418
|
+
# assert((zf - w).abs / [zf.abs, w.abs, Float::MIN].max < 1e-9, "z=#{zf.to_s} and w=#{w.to_s} should be almost equal x=#{x} y=#{y}")
|
419
|
+
assert((zf - w).abs <= [ z.unit, zf.abs / 1e9 ].max, "z=#{zf.to_s} and w=#{w.to_s} should be almost equal x=#{x} y=#{y}")
|
420
|
+
end
|
313
421
|
|
314
422
|
# check by taking log(z) = y * log(x)
|
315
423
|
# we have to take into account that we might not have enough
|
@@ -329,15 +437,15 @@ module TestLongDecHelper
|
|
329
437
|
lprec = 0
|
330
438
|
end
|
331
439
|
l10y = 0
|
332
|
-
if (y > 1) then
|
333
|
-
l10y = (Math.log(y.to_f) / Math.log(10)).ceil
|
440
|
+
if (y.abs > 1) then
|
441
|
+
l10y = (Math.log(y.abs.to_f) / Math.log(10)).ceil
|
334
442
|
end
|
335
443
|
u = LongMath.log(z, lprec)
|
336
444
|
v = LongMath.log(x, lprec+l10y)
|
337
445
|
yv = (y*v).round_to_scale(lprec, LongDecimal::ROUND_HALF_DOWN)
|
338
446
|
assert((u - yv).abs <= unit, "u=#{u} and yv=y*v=#{yv} should be almost equal (unit=#{unit} x=#{x.to_s} y=#{y.to_s} z=#{z.to_s} u=#{u.to_s} v=#{v.to_s} lprec=#{lprec} prec=#{prec})")
|
339
447
|
end
|
340
|
-
# puts("ok check_power_floated: x=#{x} y=#{y} prec=#{prec}\n")
|
448
|
+
# puts("ok check_power_floated: x=#{x} y=#{y} prec=#{prec} t=#{Time.new - t0}\n")
|
341
449
|
|
342
450
|
end
|
343
451
|
|
@@ -393,7 +501,7 @@ module TestLongDecHelper
|
|
393
501
|
eprec = [ eprec - l10, 0 ].max
|
394
502
|
end
|
395
503
|
|
396
|
-
z = LongMath.power(10
|
504
|
+
z = LongMath.power(10, y, eprec)
|
397
505
|
zz = LongMath.exp10(y, eprec)
|
398
506
|
u = z.unit
|
399
507
|
v = y.unit
|
@@ -402,6 +510,8 @@ module TestLongDecHelper
|
|
402
510
|
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
511
|
# 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})")
|
404
512
|
end
|
513
|
+
|
514
|
+
return y
|
405
515
|
|
406
516
|
end
|
407
517
|
|
@@ -448,10 +558,10 @@ module TestLongDecHelper
|
|
448
558
|
yf = y.to_f
|
449
559
|
zl = z.to_ld(y.scale)
|
450
560
|
df = [ 1e-13, z.abs / 1e10 ].max
|
451
|
-
dl = y.unit
|
561
|
+
dl = y.unit.abs
|
452
562
|
delta = [ df, dl ].max
|
453
563
|
# 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}")
|
564
|
+
assert((yf - z).abs < delta.to_f, "y=#{yf.to_s} and z=#{z.to_s} should be almost equal (x=#{x} delta=#{delta}")
|
455
565
|
end
|
456
566
|
end
|
457
567
|
|
@@ -480,6 +590,7 @@ module TestLongDecHelper
|
|
480
590
|
delta = [ v*z, u ].max
|
481
591
|
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})")
|
482
592
|
end
|
593
|
+
return y
|
483
594
|
|
484
595
|
end
|
485
596
|
|
data/test/testrandlib.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# testrandlib.rb -- runit test for long-decimal.rb
|
4
|
+
#
|
5
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testrandlib.rb,v 1.3 2006/04/30 20:49:54 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_01 $
|
7
|
+
# Author: $Author: bk1 $ (Karl Brodowsky)
|
8
|
+
#
|
9
|
+
|
10
|
+
require "crypt/ISAAC"
|
11
|
+
|
12
|
+
#
|
13
|
+
# test class for LongDecimal and LongDecimalQuot
|
14
|
+
#
|
15
|
+
module TestRandomHelper
|
16
|
+
|
17
|
+
@RCS_ID='-$Id: testrandlib.rb,v 1.3 2006/04/30 20:49:54 bk1 Exp $-'
|
18
|
+
|
19
|
+
@@r1 = Crypt::ISAAC.new
|
20
|
+
@@r2 = Crypt::ISAAC.new
|
21
|
+
@@r3 = Crypt::ISAAC.new
|
22
|
+
@@r4 = Crypt::ISAAC.new
|
23
|
+
|
24
|
+
def arr_with_sq(arr)
|
25
|
+
result = arr.map do |x|
|
26
|
+
if (x >= 0) then
|
27
|
+
[ LongMath.sqrt(x, x.scale, LongMath::ROUND_HALF_UP), x, x.square ]
|
28
|
+
else
|
29
|
+
x
|
30
|
+
end
|
31
|
+
end
|
32
|
+
result.flatten
|
33
|
+
end
|
34
|
+
|
35
|
+
def arr_with_neg(arr)
|
36
|
+
arr.map { |x| [x, -x] }.flatten
|
37
|
+
end
|
38
|
+
|
39
|
+
def arr_with_inv(arr)
|
40
|
+
result = arr.map do |x|
|
41
|
+
if (x.zero? || x.one?) then
|
42
|
+
x
|
43
|
+
else
|
44
|
+
[x, x.inverse.to_ld(x.scale*2)]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
result.flatten
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# get random numbers in an array
|
52
|
+
# xb is between 0 and 1000
|
53
|
+
# xm is between 1 and 2
|
54
|
+
# xs is between 0 and 1
|
55
|
+
# all three are LongDecimal and have the same digits after the decimal point
|
56
|
+
# out of these an array of up to 36 values is formed and returned as a[0]
|
57
|
+
# are found by adding sqrt and square of of these to the array, if >= 0
|
58
|
+
# adding the reciprocal of each non-zero entry of this array to array
|
59
|
+
# and adding negated value of each entry to the array, then sorting
|
60
|
+
# array and removing duplicates
|
61
|
+
# a[1] is an integer between 0 and 120 used as precision for exp
|
62
|
+
# a[2] is an integer between 1 and 121 used as precision for log
|
63
|
+
# a[3] is an integer between 0 and 120+(x.scale)/2 used as precision for sqrt
|
64
|
+
# a[4] is an integer between 0 and 60 used as precision for power
|
65
|
+
#
|
66
|
+
def random_arr
|
67
|
+
x0 = @@r1.rand(1000)
|
68
|
+
x1 = @@r2.rand(1000)
|
69
|
+
x2 = @@r2.rand(100)+3
|
70
|
+
x3 = @@r3.rand(1000)
|
71
|
+
x4 = @@r3.rand(100)+4
|
72
|
+
x5 = @@r4.rand(1000)
|
73
|
+
x6 = @@r4.rand(100)+5
|
74
|
+
xs = LongDecimal(x1, x2) + LongDecimal(x3, x4) + LongDecimal(x5, x6)
|
75
|
+
xm = 1 + xs
|
76
|
+
xb = x0 + xs
|
77
|
+
eprec = @@r1.rand(120)
|
78
|
+
lprec = eprec+1
|
79
|
+
sprec = eprec+((xb.scale+1)>>1)
|
80
|
+
pprec = lprec >> 1
|
81
|
+
arr = arr_with_neg(arr_with_inv(arr_with_sq([xb, xm, xs]))).sort.uniq
|
82
|
+
return [ arr, eprec, lprec, sprec, pprec, xb.scale ]
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
# end of file testrandlib.rb
|
data/test/testrandom.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
#
|
3
|
+
# testrandom.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.10 2006/04/30 20:49:54 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_01 $
|
7
7
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
8
8
|
#
|
9
9
|
|
@@ -13,39 +13,39 @@ require "runit/testsuite"
|
|
13
13
|
require "crypt/ISAAC"
|
14
14
|
|
15
15
|
load "test/testlongdeclib.rb"
|
16
|
+
load "test/testrandlib.rb"
|
16
17
|
|
17
18
|
#
|
18
19
|
# test class for LongDecimal and LongDecimalQuot
|
19
20
|
#
|
20
|
-
class
|
21
|
+
class TestRandom_class < RUNIT::TestCase
|
21
22
|
include TestLongDecHelper
|
23
|
+
include TestRandomHelper
|
22
24
|
|
23
|
-
@RCS_ID='-$Id: testrandom.rb,v 1.
|
25
|
+
@RCS_ID='-$Id: testrandom.rb,v 1.10 2006/04/30 20:49:54 bk1 Exp $-'
|
24
26
|
|
25
27
|
# for how many seconds should this test run? change to different
|
26
28
|
# value on demand
|
27
29
|
@@duration = 1000000
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
check_log2_floated(x, lprec)
|
48
|
-
check_log10_floated(x, lprec)
|
31
|
+
def check_exp_log_rand(arr, eprec, lprec, pprec, sprec, sc, cnt)
|
32
|
+
arr.each do |x|
|
33
|
+
@scnt += 1
|
34
|
+
puts("\ncnt=#{cnt} scnt=#{@scnt} x=#{x} ep=#{eprec} lp=#{lprec} sp=#{sprec} pp=#{pprec}\n")
|
35
|
+
if (x.abs <= LongMath::MAX_EXP_ABLE)
|
36
|
+
check_exp_floated(x, eprec)
|
37
|
+
check_exp2_floated(x, pprec)
|
38
|
+
check_exp10_floated(x, pprec)
|
39
|
+
end
|
40
|
+
if (x > 0)
|
41
|
+
check_log_floated(x, lprec)
|
42
|
+
check_log2_floated(x, lprec)
|
43
|
+
check_log10_floated(x, lprec)
|
44
|
+
end
|
45
|
+
if (x > 0)
|
46
|
+
xr = x.round_to_scale(sc, LongMath::ROUND_HALF_UP)
|
47
|
+
check_sqrt_with_remainder(xr, sprec, "x=#{x} p=#{sprec}")
|
48
|
+
end
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -54,28 +54,13 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
54
54
|
#
|
55
55
|
def test_random
|
56
56
|
cnt = 0
|
57
|
+
@scnt = 0
|
57
58
|
t0 = Time.new
|
58
59
|
while (true) do
|
59
60
|
d = Time.new - t0
|
60
61
|
break if d >= @@duration
|
61
|
-
|
62
|
-
|
63
|
-
x2 = @@r2.rand(100)+3
|
64
|
-
x3 = @@r3.rand(1000)
|
65
|
-
x4 = @@r3.rand(100)+4
|
66
|
-
x5 = @@r4.rand(1000)
|
67
|
-
x6 = @@r4.rand(100)+5
|
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)
|
78
|
-
check_sqrt_with_remainder(x, sprec, "x=#{x} p=#{sprec}")
|
62
|
+
arr, eprec, lprec, sprec, pprec, sc = random_arr
|
63
|
+
check_exp_log_rand(arr, eprec, lprec, pprec, sprec, sc, cnt)
|
79
64
|
cnt += 1
|
80
65
|
end
|
81
66
|
puts("done #{cnt} tests\n")
|
@@ -83,6 +68,6 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
83
68
|
|
84
69
|
end
|
85
70
|
|
86
|
-
RUNIT::CUI::TestRunner.run(
|
71
|
+
RUNIT::CUI::TestRunner.run(TestRandom_class.suite)
|
87
72
|
|
88
|
-
# end of file
|
73
|
+
# end of file testrandom.rb
|