long-decimal 0.01.00 → 0.01.01
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 +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
|