long-decimal 0.00.22 → 0.01.00

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