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.
Files changed (159) hide show
  1. data/README +6 -3
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/doc/classes/LongDecimal.html +207 -189
  5. data/doc/classes/LongDecimal.src/M000036.html +1 -1
  6. data/doc/classes/LongDecimal.src/M000037.html +1 -1
  7. data/doc/classes/LongDecimal.src/M000038.html +1 -1
  8. data/doc/classes/LongDecimal.src/M000039.html +1 -1
  9. data/doc/classes/LongDecimal.src/M000040.html +1 -1
  10. data/doc/classes/LongDecimal.src/M000041.html +1 -1
  11. data/doc/classes/LongDecimal.src/M000042.html +1 -1
  12. data/doc/classes/LongDecimal.src/M000043.html +1 -1
  13. data/doc/classes/LongDecimal.src/M000044.html +1 -1
  14. data/doc/classes/LongDecimal.src/M000045.html +1 -1
  15. data/doc/classes/LongDecimal.src/M000046.html +1 -1
  16. data/doc/classes/LongDecimal.src/M000047.html +1 -1
  17. data/doc/classes/LongDecimal.src/M000048.html +1 -1
  18. data/doc/classes/LongDecimal.src/M000049.html +1 -1
  19. data/doc/classes/LongDecimal.src/M000050.html +15 -2
  20. data/doc/classes/LongDecimal.src/M000051.html +1 -1
  21. data/doc/classes/LongDecimal.src/M000052.html +2 -2
  22. data/doc/classes/LongDecimal.src/M000053.html +1 -1
  23. data/doc/classes/LongDecimal.src/M000054.html +1 -1
  24. data/doc/classes/LongDecimal.src/M000055.html +1 -1
  25. data/doc/classes/LongDecimal.src/M000056.html +1 -1
  26. data/doc/classes/LongDecimal.src/M000057.html +1 -1
  27. data/doc/classes/LongDecimal.src/M000058.html +1 -1
  28. data/doc/classes/LongDecimal.src/M000059.html +1 -1
  29. data/doc/classes/LongDecimal.src/M000060.html +1 -1
  30. data/doc/classes/LongDecimal.src/M000062.html +1 -1
  31. data/doc/classes/LongDecimal.src/M000063.html +1 -1
  32. data/doc/classes/LongDecimal.src/M000064.html +1 -1
  33. data/doc/classes/LongDecimal.src/M000065.html +1 -1
  34. data/doc/classes/LongDecimal.src/M000066.html +4 -8
  35. data/doc/classes/LongDecimal.src/M000067.html +6 -7
  36. data/doc/classes/LongDecimal.src/M000068.html +5 -5
  37. data/doc/classes/LongDecimal.src/M000069.html +6 -6
  38. data/doc/classes/LongDecimal.src/M000070.html +9 -4
  39. data/doc/classes/LongDecimal.src/M000071.html +4 -19
  40. data/doc/classes/LongDecimal.src/M000072.html +15 -5
  41. data/doc/classes/LongDecimal.src/M000073.html +7 -7
  42. data/doc/classes/LongDecimal.src/M000074.html +7 -18
  43. data/doc/classes/LongDecimal.src/M000075.html +20 -7
  44. data/doc/classes/LongDecimal.src/M000076.html +8 -5
  45. data/doc/classes/LongDecimal.src/M000077.html +5 -9
  46. data/doc/classes/LongDecimal.src/M000078.html +5 -5
  47. data/doc/classes/LongDecimal.src/M000079.html +5 -5
  48. data/doc/classes/LongDecimal.src/M000080.html +9 -4
  49. data/doc/classes/LongDecimal.src/M000081.html +4 -7
  50. data/doc/classes/LongDecimal.src/M000082.html +4 -4
  51. data/doc/classes/LongDecimal.src/M000083.html +7 -4
  52. data/doc/classes/LongDecimal.src/M000084.html +4 -4
  53. data/doc/classes/LongDecimal.src/M000085.html +4 -9
  54. data/doc/classes/LongDecimal.src/M000086.html +6 -6
  55. data/doc/classes/LongDecimal.src/M000087.html +9 -5
  56. data/doc/classes/LongDecimal.src/M000088.html +4 -8
  57. data/doc/classes/LongDecimal.src/M000089.html +9 -4
  58. data/doc/classes/LongDecimal.src/M000090.html +4 -4
  59. data/doc/classes/LongDecimal.src/M000091.html +4 -4
  60. data/doc/classes/LongDecimal.src/M000092.html +4 -4
  61. data/doc/classes/LongDecimal.src/M000093.html +4 -59
  62. data/doc/classes/LongDecimal.src/M000094.html +59 -4
  63. data/doc/classes/LongDecimal.src/M000095.html +4 -4
  64. data/doc/classes/LongDecimal.src/M000096.html +4 -5
  65. data/doc/classes/LongDecimal.src/M000099.html +5 -5
  66. data/doc/classes/LongDecimal.src/M000100.html +5 -4
  67. data/doc/classes/LongDecimal.src/M000101.html +4 -4
  68. data/doc/classes/LongDecimal.src/M000102.html +4 -4
  69. data/doc/classes/LongDecimal.src/M000103.html +4 -4
  70. data/doc/classes/LongDecimalBase.html +53 -53
  71. data/doc/classes/LongDecimalBase.src/M000108.html +4 -4
  72. data/doc/classes/LongDecimalBase.src/M000109.html +4 -4
  73. data/doc/classes/LongDecimalBase.src/M000110.html +4 -4
  74. data/doc/classes/LongDecimalBase.src/M000111.html +4 -4
  75. data/doc/classes/LongDecimalBase.src/M000112.html +4 -9
  76. data/doc/classes/LongDecimalBase.src/M000113.html +9 -9
  77. data/doc/classes/LongDecimalBase.src/M000116.html +9 -5
  78. data/doc/classes/LongDecimalBase.src/M000117.html +5 -4
  79. data/doc/classes/LongDecimalQuot.html +1 -1
  80. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  81. data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
  82. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  83. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  84. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  85. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  86. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  87. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  88. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  89. data/doc/classes/LongDecimalQuot.src/M000012.html +2 -2
  90. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  91. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  92. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  93. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  94. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  95. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  96. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  97. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  98. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  99. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  100. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  101. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  102. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  103. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  104. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  105. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  106. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  107. data/doc/classes/LongDecimalQuot.src/M000030.html +1 -1
  108. data/doc/classes/LongDecimalQuot.src/M000031.html +1 -1
  109. data/doc/classes/LongDecimalQuot.src/M000034.html +1 -1
  110. data/doc/classes/LongDecimalQuot.src/M000035.html +1 -1
  111. data/doc/classes/LongDecimalRoundingMode.html +6 -1
  112. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +37 -16
  113. data/doc/classes/LongMath.html +246 -161
  114. data/doc/classes/LongMath.src/M000119.html +5 -4
  115. data/doc/classes/LongMath.src/M000120.html +4 -4
  116. data/doc/classes/LongMath.src/M000121.html +4 -5
  117. data/doc/classes/LongMath.src/M000122.html +5 -4
  118. data/doc/classes/LongMath.src/M000123.html +4 -18
  119. data/doc/classes/LongMath.src/M000124.html +14 -14
  120. data/doc/classes/LongMath.src/M000125.html +18 -5
  121. data/doc/classes/LongMath.src/M000126.html +5 -29
  122. data/doc/classes/LongMath.src/M000127.html +29 -5
  123. data/doc/classes/LongMath.src/M000128.html +5 -57
  124. data/doc/classes/LongMath.src/M000129.html +55 -19
  125. data/doc/classes/LongMath.src/M000130.html +20 -35
  126. data/doc/classes/LongMath.src/M000131.html +36 -6
  127. data/doc/classes/LongMath.src/M000132.html +6 -33
  128. data/doc/classes/LongMath.src/M000133.html +26 -44
  129. data/doc/classes/LongMath.src/M000134.html +49 -5
  130. data/doc/classes/LongMath.src/M000135.html +7 -4
  131. data/doc/classes/LongMath.src/M000136.html +4 -4
  132. data/doc/classes/LongMath.src/M000137.html +4 -72
  133. data/doc/classes/LongMath.src/M000138.html +67 -39
  134. data/doc/classes/LongMath.src/M000139.html +44 -4
  135. data/doc/classes/LongMath.src/M000140.html +4 -4
  136. data/doc/classes/LongMath.src/M000141.html +4 -6
  137. data/doc/classes/LongMath.src/M000142.html +4 -18
  138. data/doc/classes/LongMath.src/M000143.html +8 -7
  139. data/doc/classes/LongMath.src/M000144.html +10 -35
  140. data/doc/classes/LongMath.src/M000145.html +23 -202
  141. data/doc/classes/LongMath.src/M000146.html +322 -4
  142. data/doc/classes/LongMath.src/M000147.html +22 -63
  143. data/doc/classes/LongMath.src/M000148.html +65 -33
  144. data/doc/classes/LongMath/CacheKey.html +5 -5
  145. data/doc/classes/Numeric.html +11 -11
  146. data/doc/classes/Numeric.src/M000105.html +9 -4
  147. data/doc/classes/Rational.html +6 -6
  148. data/doc/created.rid +1 -1
  149. data/doc/files/lib/long-decimal_rb.html +2 -2
  150. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  151. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  152. data/doc/fr_method_index.html +102 -95
  153. data/lib/long-decimal.rb +206 -49
  154. data/test/testlongdecimal.rb +736 -21
  155. data/test/testlongdeclib.rb +136 -25
  156. data/test/testrandlib.rb +87 -0
  157. data/test/testrandom.rb +30 -45
  158. data/test/testrandpower.rb +72 -0
  159. metadata +4 -2
@@ -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.7 2006/04/10 21:47:02 bk1 Exp $
6
- # CVS-Label: $Name: ALPHA_01_00 $
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.7 2006/04/10 21:47:02 bk1 Exp $-'
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
- full_message = build_message(message, "Expected <?> to match <?>", actual, expected)
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
- 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
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
- yd, yu = yu, yd
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
- yd <= y && y <= yu && yu - yd <= y.unit
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
- # puts("start: check_power_floated: x=#{x} y=#{y} prec=#{prec}\n")
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
- # compare y against w = x**y calculated using regular floating point arithmetic
309
- w = (x.to_f) ** (y.to_f)
310
- zf = z.to_f
311
- # 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}")
312
- 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}")
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.to_ld, y, eprec)
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
 
@@ -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
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
- # testlongdecimal.rb -- runit test for long-decimal.rb
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.5 2006/04/10 21:47:02 bk1 Exp $
6
- # CVS-Label: $Name: ALPHA_01_00 $
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 TestLongDecimal_class < RUNIT::TestCase
21
+ class TestRandom_class < RUNIT::TestCase
21
22
  include TestLongDecHelper
23
+ include TestRandomHelper
22
24
 
23
- @RCS_ID='-$Id: testrandom.rb,v 1.5 2006/04/10 21:47:02 bk1 Exp $-'
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
- @@r1 = Crypt::ISAAC.new
30
- @@r2 = Crypt::ISAAC.new
31
- @@r3 = Crypt::ISAAC.new
32
- @@r4 = Crypt::ISAAC.new
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)
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
- x0 = @@r1.rand(1000)
62
- x1 = @@r2.rand(1000)
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(TestLongDecimal_class.suite)
71
+ RUNIT::CUI::TestRunner.run(TestRandom_class.suite)
87
72
 
88
- # end of file testlongdecimal.rb
73
+ # end of file testrandom.rb