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.
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