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
@@ -10,7 +10,7 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1709</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1760</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>(<span class="ruby-identifier">a</span>, <span class="ruby-identifier">b</span> = <span class="ruby-value">0</span>)
15
15
  <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">a</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>) <span class="ruby-keyword kw">then</span>
16
16
  <span class="ruby-identifier">a</span>
@@ -10,7 +10,7 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1722</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1773</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimalQuot</span>(<span class="ruby-identifier">first</span>, <span class="ruby-identifier">second</span>)
15
15
  <span class="ruby-constant">LongDecimalQuot</span>.<span class="ruby-identifier">new!</span>(<span class="ruby-identifier">first</span>, <span class="ruby-identifier">second</span>)
16
16
  <span class="ruby-keyword kw">end</span></pre>
@@ -23,23 +23,23 @@
23
23
  <a href="classes/LongDecimal.html#M000076">% (LongDecimal)</a><br />
24
24
  <a href="classes/LongDecimalQuot.html#M000023">% (LongDecimalQuot)</a><br />
25
25
  <a href="classes/LongDecimal.html#M000077">& (LongDecimal)</a><br />
26
- <a href="classes/LongDecimalQuot.html#M000019">* (LongDecimalQuot)</a><br />
27
26
  <a href="classes/LongDecimal.html#M000069">* (LongDecimal)</a><br />
28
- <a href="classes/LongDecimal.html#M000074">** (LongDecimal)</a><br />
27
+ <a href="classes/LongDecimalQuot.html#M000019">* (LongDecimalQuot)</a><br />
29
28
  <a href="classes/LongDecimalQuot.html#M000021">** (LongDecimalQuot)</a><br />
29
+ <a href="classes/LongDecimal.html#M000074">** (LongDecimal)</a><br />
30
30
  <a href="classes/LongDecimalQuot.html#M000017">+ (LongDecimalQuot)</a><br />
31
31
  <a href="classes/LongDecimal.html#M000067">+ (LongDecimal)</a><br />
32
32
  <a href="classes/LongDecimalBase.html#M000110">+@ (LongDecimalBase)</a><br />
33
- <a href="classes/LongDecimalQuot.html#M000018">- (LongDecimalQuot)</a><br />
34
33
  <a href="classes/LongDecimal.html#M000068">- (LongDecimal)</a><br />
35
- <a href="classes/LongDecimalQuot.html#M000016">-@ (LongDecimalQuot)</a><br />
34
+ <a href="classes/LongDecimalQuot.html#M000018">- (LongDecimalQuot)</a><br />
36
35
  <a href="classes/LongDecimal.html#M000066">-@ (LongDecimal)</a><br />
37
- <a href="classes/LongDecimalQuot.html#M000020">/ (LongDecimalQuot)</a><br />
36
+ <a href="classes/LongDecimalQuot.html#M000016">-@ (LongDecimalQuot)</a><br />
38
37
  <a href="classes/LongDecimal.html#M000073">/ (LongDecimal)</a><br />
38
+ <a href="classes/LongDecimalQuot.html#M000020">/ (LongDecimalQuot)</a><br />
39
39
  <a href="classes/LongDecimal.html#M000081"><< (LongDecimal)</a><br />
40
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000150"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
41
40
  <a href="classes/LongDecimalBase.html#M000115"><=> (LongDecimalBase)</a><br />
42
41
  <a href="classes/LongMath/CacheKey.html#M000149"><=> (LongMath::CacheKey)</a><br />
42
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000150"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
43
43
  <a href="classes/LongDecimal.html#M000098">== (LongDecimal)</a><br />
44
44
  <a href="classes/LongDecimalQuot.html#M000027">== (LongDecimalQuot)</a><br />
45
45
  <a href="classes/LongDecimal.html#M000099">=== (LongDecimal)</a><br />
@@ -67,8 +67,8 @@
67
67
  <a href="classes/LongDecimal.html#M000054">denominator (LongDecimal)</a><br />
68
68
  <a href="classes/LongDecimal.html#M000070">divide (LongDecimal)</a><br />
69
69
  <a href="classes/LongDecimal.html#M000071">divide_s (LongDecimal)</a><br />
70
- <a href="classes/LongDecimal.html#M000075">divmod (LongDecimal)</a><br />
71
70
  <a href="classes/LongDecimalQuot.html#M000022">divmod (LongDecimalQuot)</a><br />
71
+ <a href="classes/LongDecimal.html#M000075">divmod (LongDecimal)</a><br />
72
72
  <a href="classes/LongDecimal.html#M000058">equalize_scale (LongDecimal)</a><br />
73
73
  <a href="classes/LongMath.html#M000134">exp (LongMath)</a><br />
74
74
  <a href="classes/LongMath.html#M000136">exp10 (LongMath)</a><br />
@@ -76,20 +76,21 @@
76
76
  <a href="classes/LongMath.html#M000137">exp_internal (LongMath)</a><br />
77
77
  <a href="classes/LongMath.html#M000138">exp_raw (LongMath)</a><br />
78
78
  <a href="classes/LongMath.html#M000129">gcd_with_high_power (LongMath)</a><br />
79
- <a href="classes/LongDecimal.html#M000102">hash (LongDecimal)</a><br />
80
79
  <a href="classes/LongDecimalQuot.html#M000034">hash (LongDecimalQuot)</a><br />
81
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000151">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
80
+ <a href="classes/LongDecimal.html#M000102">hash (LongDecimal)</a><br />
81
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000152">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
82
82
  <a href="classes/LongDecimalBase.html#M000108">inc (LongDecimalBase)</a><br />
83
- <a href="classes/LongDecimal.html#M000063">inc! (LongDecimal)</a><br />
84
83
  <a href="classes/LongDecimalQuot.html#M000014">inc! (LongDecimalQuot)</a><br />
84
+ <a href="classes/LongDecimal.html#M000063">inc! (LongDecimal)</a><br />
85
85
  <a href="classes/LongDecimal.html#M000103">inspect (LongDecimal)</a><br />
86
86
  <a href="classes/LongDecimalQuot.html#M000035">inspect (LongDecimalQuot)</a><br />
87
87
  <a href="classes/LongMath.html#M000132">int_digits10 (LongMath)</a><br />
88
88
  <a href="classes/LongDecimal.html#M000057">int_digits10 (LongDecimal)</a><br />
89
89
  <a href="classes/LongDecimal.html#M000055">int_digits2 (LongDecimal)</a><br />
90
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000151">inverse (LongDecimalRoundingMode::RoundingModeClass)</a><br />
90
91
  <a href="classes/LongDecimalBase.html#M000113">inverse (LongDecimalBase)</a><br />
91
- <a href="classes/LongDecimal.html#M000094">is_int? (LongDecimal)</a><br />
92
92
  <a href="classes/LongDecimalQuot.html#M000030">is_int? (LongDecimalQuot)</a><br />
93
+ <a href="classes/LongDecimal.html#M000094">is_int? (LongDecimal)</a><br />
93
94
  <a href="classes/LongMath.html#M000141">log (LongMath)</a><br />
94
95
  <a href="classes/LongMath.html#M000142">log10 (LongMath)</a><br />
95
96
  <a href="classes/LongMath.html#M000143">log2 (LongMath)</a><br />
@@ -103,16 +104,16 @@
103
104
  <a href="classes/LongDecimal.html#M000088">move_point_right_int (LongDecimal)</a><br />
104
105
  <a href="classes/LongMath.html#M000131">multiplicity_of_10 (LongMath)</a><br />
105
106
  <a href="classes/LongMath.html#M000130">multiplicity_of_factor (LongMath)</a><br />
106
- <a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
107
107
  <a href="classes/LongDecimal.html#M000043">new (LongDecimal)</a><br />
108
+ <a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
108
109
  <a href="classes/LongDecimal.html#M000036">new! (LongDecimal)</a><br />
109
110
  <a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
110
111
  <a href="classes/LongDecimal.html#M000061">next (LongDecimal)</a><br />
111
112
  <a href="classes/LongDecimalQuot.html#M000005">numerator (LongDecimalQuot)</a><br />
112
113
  <a href="classes/LongDecimal.html#M000038">one! (LongDecimal)</a><br />
113
- <a href="classes/LongDecimal.html#M000101">one? (LongDecimal)</a><br />
114
- <a href="classes/LongDecimalQuot.html#M000029">one? (LongDecimalQuot)</a><br />
115
114
  <a href="classes/Numeric.html#M000105">one? (Numeric)</a><br />
115
+ <a href="classes/LongDecimalQuot.html#M000029">one? (LongDecimalQuot)</a><br />
116
+ <a href="classes/LongDecimal.html#M000101">one? (LongDecimal)</a><br />
116
117
  <a href="classes/LongMath.html#M000133">pi (LongMath)</a><br />
117
118
  <a href="classes/LongMath.html#M000147">power (LongMath)</a><br />
118
119
  <a href="classes/LongMath.html#M000148">power_internal (LongMath)</a><br />
@@ -123,16 +124,16 @@
123
124
  <a href="classes/LongDecimal.html#M000046">round_to_scale (LongDecimal)</a><br />
124
125
  <a href="classes/LongDecimalQuot.html#M000025">round_to_scale (LongDecimalQuot)</a><br />
125
126
  <a href="classes/LongDecimal.html#M000045">round_trailing_zeros (LongDecimal)</a><br />
126
- <a href="classes/LongDecimalQuot.html#M000007">scale= (LongDecimalQuot)</a><br />
127
127
  <a href="classes/LongDecimal.html#M000044">scale= (LongDecimal)</a><br />
128
+ <a href="classes/LongDecimalQuot.html#M000007">scale= (LongDecimalQuot)</a><br />
128
129
  <a href="classes/LongDecimalBase.html#M000117">scale_equal (LongDecimalBase)</a><br />
129
130
  <a href="classes/LongDecimalBase.html#M000116">scale_ufo (LongDecimalBase)</a><br />
130
131
  <a href="classes/LongDecimal.html#M000095">sgn (LongDecimal)</a><br />
131
132
  <a href="classes/LongDecimalQuot.html#M000031">sgn (LongDecimalQuot)</a><br />
132
133
  <a href="classes/LongDecimal.html#M000097">sign (LongDecimal)</a><br />
133
134
  <a href="classes/LongDecimalQuot.html#M000033">sign (LongDecimalQuot)</a><br />
134
- <a href="classes/LongDecimalQuot.html#M000032">signum (LongDecimalQuot)</a><br />
135
135
  <a href="classes/LongDecimal.html#M000096">signum (LongDecimal)</a><br />
136
+ <a href="classes/LongDecimalQuot.html#M000032">signum (LongDecimalQuot)</a><br />
136
137
  <a href="classes/LongDecimalQuot.html#M000013">sint_digits10 (LongDecimalQuot)</a><br />
137
138
  <a href="classes/LongDecimal.html#M000056">sint_digits10 (LongDecimal)</a><br />
138
139
  <a href="classes/LongDecimal.html#M000084">size (LongDecimal)</a><br />
@@ -149,10 +150,10 @@
149
150
  <a href="classes/LongDecimal.html#M000089">square (LongDecimal)</a><br />
150
151
  <a href="classes/LongDecimal.html#M000060">succ (LongDecimal)</a><br />
151
152
  <a href="classes/LongDecimal.html#M000040">ten! (LongDecimal)</a><br />
152
- <a href="classes/LongDecimal.html#M000053">to_bd (LongDecimal)</a><br />
153
153
  <a href="classes/LongDecimalQuot.html#M000010">to_bd (LongDecimalQuot)</a><br />
154
- <a href="classes/LongDecimalQuot.html#M000009">to_f (LongDecimalQuot)</a><br />
154
+ <a href="classes/LongDecimal.html#M000053">to_bd (LongDecimal)</a><br />
155
155
  <a href="classes/LongDecimal.html#M000050">to_f (LongDecimal)</a><br />
156
+ <a href="classes/LongDecimalQuot.html#M000009">to_f (LongDecimalQuot)</a><br />
156
157
  <a href="classes/LongDecimalQuot.html#M000011">to_i (LongDecimalQuot)</a><br />
157
158
  <a href="classes/LongDecimal.html#M000051">to_i (LongDecimal)</a><br />
158
159
  <a href="classes/Rational.html#M000106">to_ld (Rational)</a><br />
@@ -160,8 +161,8 @@
160
161
  <a href="classes/LongDecimal.html#M000052">to_ld (LongDecimal)</a><br />
161
162
  <a href="classes/LongDecimalQuot.html#M000012">to_ld (LongDecimalQuot)</a><br />
162
163
  <a href="classes/LongDecimalBase.html#M000107">to_r (LongDecimalBase)</a><br />
163
- <a href="classes/LongDecimalQuot.html#M000008">to_s (LongDecimalQuot)</a><br />
164
164
  <a href="classes/LongDecimal.html#M000047">to_s (LongDecimal)</a><br />
165
+ <a href="classes/LongDecimalQuot.html#M000008">to_s (LongDecimalQuot)</a><br />
165
166
  <a href="classes/LongDecimal.html#M000048">to_s_10 (LongDecimal)</a><br />
166
167
  <a href="classes/LongDecimal.html#M000049">to_s_internal (LongDecimal)</a><br />
167
168
  <a href="classes/LongDecimal.html#M000039">two! (LongDecimal)</a><br />
@@ -1,8 +1,8 @@
1
1
  #
2
2
  # long-decimal.rb -- Arbitrary precision decimals with fixed decimal point
3
3
  #
4
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.26 2006/04/07 22:26:08 bk1 Exp $
5
- # CVS-Label: $Name: PRE_ALPHA_0_22 $
4
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $
5
+ # CVS-Label: $Name: ALPHA_01_00 $
6
6
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
7
  #
8
8
  require "complex"
@@ -37,6 +37,10 @@ module LongDecimalRoundingMode
37
37
  end
38
38
  end
39
39
 
40
+ def inverse
41
+ LongDecimalRoundingMode::INVERSE_MODE[self]
42
+ end
43
+
40
44
  def hash
41
45
  num
42
46
  end
@@ -46,14 +50,29 @@ module LongDecimalRoundingMode
46
50
  #
47
51
  # rounding modes as constants
48
52
  #
49
- ROUND_UP = RoundingModeClass.new(:ROUND_UP, 0)
50
- ROUND_DOWN = RoundingModeClass.new(:ROUND_DOWN, 1)
51
- ROUND_CEILING = RoundingModeClass.new(:ROUND_CEILING, 2)
52
- ROUND_FLOOR = RoundingModeClass.new(:ROUND_FLOOR, 3)
53
- ROUND_HALF_UP = RoundingModeClass.new(:ROUND_HALF_UP, 4)
54
- ROUND_HALF_DOWN = RoundingModeClass.new(:ROUND_HALF_DOWN, 5)
55
- ROUND_HALF_EVEN = RoundingModeClass.new(:ROUND_HALF_EVEN, 6)
56
- ROUND_UNNECESSARY = RoundingModeClass.new(:ROUND_UNNECESSARY, 7)
53
+ ROUND_UP = RoundingModeClass.new(:ROUND_UP, 0)
54
+ ROUND_DOWN = RoundingModeClass.new(:ROUND_DOWN, 1)
55
+ ROUND_CEILING = RoundingModeClass.new(:ROUND_CEILING, 2)
56
+ ROUND_FLOOR = RoundingModeClass.new(:ROUND_FLOOR, 3)
57
+ ROUND_HALF_UP = RoundingModeClass.new(:ROUND_HALF_UP, 4)
58
+ ROUND_HALF_DOWN = RoundingModeClass.new(:ROUND_HALF_DOWN, 5)
59
+ ROUND_HALF_CEILING = RoundingModeClass.new(:ROUND_HALF_CEILING, 6)
60
+ ROUND_HALF_FLOOR = RoundingModeClass.new(:ROUND_HALF_FLOOR, 7)
61
+ ROUND_HALF_EVEN = RoundingModeClass.new(:ROUND_HALF_EVEN, 8)
62
+ ROUND_UNNECESSARY = RoundingModeClass.new(:ROUND_UNNECESSARY, 9)
63
+
64
+ INVERSE_MODE = {
65
+ ROUND_UP => ROUND_DOWN,
66
+ ROUND_DOWN => ROUND_UP,
67
+ ROUND_CEILING => ROUND_FLOOR,
68
+ ROUND_FLOOR => ROUND_CEILING,
69
+ ROUND_HALF_UP => ROUND_HALF_DOWN,
70
+ ROUND_HALF_DOWN => ROUND_HALF_UP,
71
+ ROUND_HALF_CEILING => ROUND_HALF_FLOOR,
72
+ ROUND_HALF_FLOOR => ROUND_HALF_CEILING,
73
+ ROUND_HALF_EVEN => ROUND_HALF_EVEN,
74
+ ROUND_UNNECESSARY => ROUND_UNNECESSARY
75
+ }
57
76
 
58
77
  end # LongDecimalRoundingMode
59
78
 
@@ -61,7 +80,7 @@ end # LongDecimalRoundingMode
61
80
  # common base class for LongDecimal and LongDecimalQuot
62
81
  #
63
82
  class LongDecimalBase < Numeric
64
- @RCS_ID='-$Id: long-decimal.rb,v 1.26 2006/04/07 22:26:08 bk1 Exp $-'
83
+ @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
65
84
 
66
85
  include LongDecimalRoundingMode
67
86
 
@@ -169,7 +188,7 @@ end # class LongDecimalBase
169
188
  # digits and the other one the position of the decimal point.
170
189
  #
171
190
  class LongDecimal < LongDecimalBase
172
- @RCS_ID='-$Id: long-decimal.rb,v 1.26 2006/04/07 22:26:08 bk1 Exp $-'
191
+ @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
173
192
 
174
193
  # MINUS_ONE = LongDecimal(-1)
175
194
  # ZERO = LongDecimal(0)
@@ -806,7 +825,11 @@ class LongDecimal < LongDecimalBase
806
825
  def divide_s(other, new_scale, rounding_mode)
807
826
  q = self / other
808
827
  if (q.kind_of? Float) then
809
- q = LongDecimal(q)
828
+ if (new_scale.nil?) then
829
+ q = LongDecimal(q)
830
+ else
831
+ q = q.to_ld(new_scale, rounding_mode)
832
+ end
810
833
  end
811
834
  if (q.kind_of? LongDecimalBase) then
812
835
  if (new_scale.nil?) then
@@ -1202,7 +1225,7 @@ end # LongDecimal
1202
1225
  #
1203
1226
  class LongDecimalQuot < LongDecimalBase
1204
1227
 
1205
- @RCS_ID='-$Id: long-decimal.rb,v 1.26 2006/04/07 22:26:08 bk1 Exp $-'
1228
+ @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
1206
1229
 
1207
1230
  #
1208
1231
  # constructor
@@ -1337,7 +1360,18 @@ class LongDecimalQuot < LongDecimalBase
1337
1360
  #
1338
1361
  def sint_digits10
1339
1362
  if (@digits10.nil?)
1340
- @digits10 = LongMath.int_digits10(numerator.abs / denominator)
1363
+ if zero?
1364
+ @digits10 = nil
1365
+ else
1366
+ n = numerator.abs
1367
+ d = denominator
1368
+ i = 0
1369
+ while (n < d)
1370
+ i += 1
1371
+ n *= 10
1372
+ end
1373
+ @digits10 = LongMath.int_digits10(n/d) - i
1374
+ end
1341
1375
  end
1342
1376
  @digits10
1343
1377
  end
@@ -1557,6 +1591,23 @@ class LongDecimalQuot < LongDecimalBase
1557
1591
  mode = (sign_quot < 0) ? ROUND_UP : ROUND_DOWN
1558
1592
 
1559
1593
  else
1594
+
1595
+ if (mode == ROUND_HALF_CEILING)
1596
+ # ROUND_HALF_CEILING goes to the closest allowed number >= self, even
1597
+ # for negative numbers. Since sign is handled separately, it is
1598
+ # more conveniant to use ROUND_HALF_UP or ROUND_HALF_DOWN depending on the
1599
+ # sign.
1600
+ mode = (sign_quot > 0) ? ROUND_HALF_UP : ROUND_HALF_DOWN
1601
+
1602
+ elsif (mode == ROUND_HALF_FLOOR)
1603
+ # ROUND_HALF_FLOOR goes to the closest allowed number <= self, even
1604
+ # for negative numbers. Since sign is handled separately, it is
1605
+ # more conveniant to use ROUND_HALF_UP or ROUND_HALF_DOWN depending on the
1606
+ # sign.
1607
+ mode = (sign_quot < 0) ? ROUND_HALF_UP : ROUND_HALF_DOWN
1608
+
1609
+ end
1610
+
1560
1611
  # handle the ROUND_HALF_... stuff and find the adequate ROUND_UP
1561
1612
  # or ROUND_DOWN to use
1562
1613
  abs_rem = rem.abs
@@ -2324,13 +2375,14 @@ module LongMath
2324
2375
  # private helper method for exponentiation
2325
2376
  # calculate internal precision
2326
2377
  #
2327
- def LongMath.calc_iprec_for_exp(x, prec)
2378
+ def LongMath.calc_iprec_for_exp(x, prec, x_was_neg)
2328
2379
  iprec_extra = 0
2329
2380
  if (x > 1) then
2330
2381
  xf = x.to_f
2331
2382
  iprec_extra = (xf / LOG10).abs
2332
2383
  end
2333
2384
  iprec = ((prec+12) * 1.20 + iprec_extra * 1.10).round
2385
+ # iprec = ((prec+15) * 1.20 + iprec_extra * 1.10).round
2334
2386
  # iprec = ((prec+10) * 1.20 + iprec_extra * 1.10).round
2335
2387
  # iprec = ((prec+10)*1.20 + iprec_extra).round
2336
2388
  # iprec = ((prec+10)*1.20 + iprec_extra*1.20).round
@@ -2338,6 +2390,9 @@ module LongMath
2338
2390
  if (iprec < prec) then
2339
2391
  iprec = prec
2340
2392
  end
2393
+ if (x_was_neg)
2394
+ iprec += 2
2395
+ end
2341
2396
  iprec
2342
2397
  end
2343
2398
 
@@ -2369,9 +2424,14 @@ module LongMath
2369
2424
 
2370
2425
  # if the result would come out to zero anyway, cut the work
2371
2426
  xi = x.to_i
2372
- if (xi < -LongMath::MAX_FLOATABLE) || -((xi.to_f - 1) / LOG10) > prec+1 then
2427
+ if (xi < -LongMath::MAX_FLOATABLE) || -((xi.to_f - 1) / LOG10) > prec+10 then
2373
2428
  return LongDecimal(25, prec+2).round_to_scale(prec, final_mode)
2374
2429
  end
2430
+ x_was_neg = false
2431
+ if (x < 0) then
2432
+ x = -x
2433
+ x_was_neg = true
2434
+ end
2375
2435
 
2376
2436
  if j == nil || k == nil then
2377
2437
  s1 = (prec * LOG10 / LOG2) ** (1.0/3.0)
@@ -2395,7 +2455,7 @@ module LongMath
2395
2455
  check_is_int(k, "k")
2396
2456
 
2397
2457
  if (iprec == nil) then
2398
- iprec = calc_iprec_for_exp(x, prec)
2458
+ iprec = calc_iprec_for_exp(x, prec, x_was_neg)
2399
2459
  end
2400
2460
  check_is_prec(iprec, "iprec")
2401
2461
 
@@ -2409,6 +2469,9 @@ module LongMath
2409
2469
  # keep result around for exp(1)
2410
2470
  set_cached(cache_key, y_k) if (cache_result)
2411
2471
  end
2472
+ if (x_was_neg)
2473
+ y_k = y_k.reciprocal
2474
+ end
2412
2475
  y = y_k.round_to_scale(prec, final_mode)
2413
2476
  y
2414
2477
 
@@ -2421,6 +2484,7 @@ module LongMath
2421
2484
  def LongMath.exp_raw(x, prec, j, k, iprec, mode)
2422
2485
  # dprec = [ (iprec*0.9).round , (prec + 1) << 1 ].min
2423
2486
  dprec = [ (iprec*0.9).round, prec ].max
2487
+ # puts("prec=#{prec} dprec=#{dprec} iprec=#{iprec}")
2424
2488
 
2425
2489
  unless (x.kind_of? LongDecimal)
2426
2490
  x = x.to_ld(iprec, mode)
@@ -2546,7 +2610,7 @@ module LongMath
2546
2610
 
2547
2611
  check_is_prec(prec, "prec")
2548
2612
  check_is_mode(mode, "mode")
2549
- iprec = prec + 2
2613
+ iprec = prec + 5
2550
2614
  unless (x.kind_of? LongDecimal)
2551
2615
  x = x.to_ld(iprec, mode)
2552
2616
  end
@@ -2570,7 +2634,7 @@ module LongMath
2570
2634
 
2571
2635
  check_is_prec(prec, "prec")
2572
2636
  check_is_mode(mode, "mode")
2573
- iprec = prec + 2
2637
+ iprec = prec + 6
2574
2638
  unless (x.kind_of? LongDecimal)
2575
2639
  x = x.to_ld(iprec, mode)
2576
2640
  end
@@ -2611,7 +2675,8 @@ module LongMath
2611
2675
  check_is_mode(mode, "mode")
2612
2676
 
2613
2677
  if (iprec == nil) then
2614
- iprec = ((prec+10)*1.20).round
2678
+ # iprec = ((prec+10)*1.20).round
2679
+ iprec = ((prec+12)*1.20).round
2615
2680
  end
2616
2681
  if (iprec < prec) then
2617
2682
  iprec = prec
@@ -2718,7 +2783,8 @@ module LongMath
2718
2783
  logx_f = Math.log(x_f.abs)
2719
2784
  logy_f = Math.log(y_f.abs)
2720
2785
  logx_y_f = logx_f * y_f
2721
- iprec_x = calc_iprec_for_exp(logx_y_f, prec)
2786
+ iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0)
2787
+ # iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0) + 10
2722
2788
  iprec_y = iprec_x
2723
2789
  iprec = iprec_x + 2
2724
2790
  if (logx_f < 0)
@@ -2744,7 +2810,8 @@ module LongMath
2744
2810
  raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
2745
2811
  # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
2746
2812
  # raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x <= MAX_FLOATABLE
2747
- raise TypeError, "x=#{x.inspect} must not positive" unless x >= 0
2813
+ # raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?
2814
+ raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
2748
2815
  check_is_prec(prec, "prec")
2749
2816
  check_is_mode(mode, "mode")
2750
2817
 
@@ -2774,7 +2841,8 @@ module LongMath
2774
2841
  end
2775
2842
  if (y.kind_of? Integer)
2776
2843
  unless x.kind_of? LongDecimal
2777
- x = x.to_ld(prec)
2844
+ # x = x.to_ld(prec)
2845
+ x = x.to_ld(iprec_x)
2778
2846
  end
2779
2847
  z = x**y
2780
2848
  return z.to_ld(prec, mode)
@@ -2783,7 +2851,8 @@ module LongMath
2783
2851
  # it can be assumed that the exponent is not an integer, so it should
2784
2852
  # be converted into LongDecimal
2785
2853
  unless (y.kind_of? LongDecimal)
2786
- y = y.to_ld(prec, mode)
2854
+ # y = y.to_ld(prec, mode)
2855
+ y = y.to_ld(iprec_y, mode)
2787
2856
  end
2788
2857
 
2789
2858
  # exponent is split in two parts, an integer part and a
@@ -2795,7 +2864,8 @@ module LongMath
2795
2864
  if (y0 > 0)
2796
2865
  prec_extra = (y0*Math.log10(x.to_f).abs).ceil
2797
2866
  end
2798
- z1 = LongMath.power_internal(x, y1, prec+prec_extra, mode)
2867
+ # z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
2868
+ z1 = LongMath.power_internal(x, y1, prec+prec_extra + 3, mode)
2799
2869
  z = z0 * z1
2800
2870
  return z.to_ld(prec, mode)
2801
2871
  end
@@ -2838,15 +2908,20 @@ module LongMath
2838
2908
  iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
2839
2909
  end
2840
2910
  unless (x.kind_of? LongDecimal)
2841
- x = x.to_ld(iprec, mode)
2911
+ # x = x.to_ld(iprec, mode)
2912
+ x = x.to_ld(iprec_x, mode)
2842
2913
  end
2843
2914
  unless (y.kind_of? LongDecimal)
2844
- y = y.to_ld(iprec, mode)
2915
+ # y = y.to_ld(iprec, mode)
2916
+ y = y.to_ld(iprec_y, mode)
2845
2917
  end
2846
2918
 
2847
- logx = log(x, iprec, mode)
2919
+ # logx = log(x, iprec, mode)
2920
+ logx = log(x, iprec + 20, mode)
2848
2921
  logx_y = logx*y
2849
- xy = exp_internal(logx_y, prec + 1, mode)
2922
+ # xy = exp_internal(logx_y, prec + 1, mode)
2923
+ # xy = exp_internal(logx_y, prec + 4, mode)
2924
+ xy = exp_internal(logx_y, prec + 3, mode)
2850
2925
  xy.round_to_scale(prec, final_mode)
2851
2926
 
2852
2927
  end # power_internal
@@ -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/testlongdecimal.rb,v 1.32 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/testlongdecimal.rb,v 1.41 2006/04/11 19:39:43 bk1 Exp $
6
+ # CVS-Label: $Name: ALPHA_01_00 $
7
7
  # Author: $Author: bk1 $ (Karl Brodowsky)
8
8
  #
9
9
 
@@ -20,7 +20,7 @@ load "test/testlongdeclib.rb"
20
20
  class TestLongDecimal_class < RUNIT::TestCase
21
21
  include TestLongDecHelper
22
22
 
23
- @RCS_ID='-$Id: testlongdecimal.rb,v 1.32 2006/04/07 22:26:08 bk1 Exp $-'
23
+ @RCS_ID='-$Id: testlongdecimal.rb,v 1.41 2006/04/11 19:39:43 bk1 Exp $-'
24
24
 
25
25
  #
26
26
  # test split_to_words and merge_from_words
@@ -88,6 +88,11 @@ class TestLongDecimal_class < RUNIT::TestCase
88
88
  # random tests that have failed previously
89
89
  check_exp_floated(LongDecimal("0.0000000000000000000000000050000000000000000000000000000000000000000000000000000000000000017066"), 25)
90
90
  check_exp_floated(LongDecimal("0.00000000000000000000000000000000000000000000000000000000000000570000000004000000000000050"), 86)
91
+ check_exp_floated(LongDecimal("-51.0000000000000000000000000000000000000000000000000000000000000000000002300000000434000994"), 22)
92
+ check_exp_floated(LongDecimal("0.0000000000000000000000816000000000000000000000000000066500000949"), 55)
93
+ check_exp_floated(LongDecimal("0.0000000000000000000000000000000000000000000012100000000000000000565000000000000000000000000593"), 94)
94
+ check_exp_floated(LongDecimal("0.49999999987500000004166666665104166667291666666406250000111607142808314732164558531736266121036184952198542695369806246270654055688438826256113701277472962860048170064139001013692959178218223"), 9)
95
+ check_exp_floated(LongDecimal("0.000000000000000000000000000000000000000000000000695000000000000000000000000000042500000000000000552"), 50)
91
96
  end
92
97
 
93
98
  #
@@ -129,6 +134,36 @@ class TestLongDecimal_class < RUNIT::TestCase
129
134
 
130
135
  end
131
136
 
137
+ #
138
+ # test exp2 of LongMath
139
+ #
140
+ def test_exp2
141
+ 10.times do |i|
142
+ n = (i*i+i)/2
143
+ x = LongDecimal(n, 3*i)+LongMath.pi(20)
144
+ y = LongMath.exp2(x, n)
145
+ yy = LongMath.exp2(x, n + 5)
146
+ assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
147
+ z = LongMath.power(2, x, n)
148
+ assert_equal(z, y, "exp2 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
149
+ end
150
+ end
151
+
152
+ #
153
+ # test exp10 of LongMath
154
+ #
155
+ def test_exp10
156
+ 10.times do |i|
157
+ n = (i*i+i)/2
158
+ x = LongDecimal(n, 3*i)+LongMath.pi(20)
159
+ y = LongMath.exp10(x, n)
160
+ yy = LongMath.exp10(x, n + 5)
161
+ assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
162
+ z = LongMath.power(10, x, n)
163
+ assert_equal(z, y, "exp10 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
164
+ end
165
+ end
166
+
132
167
  #
133
168
  # test LongMath.power for bases that can be expressed as integer
134
169
  #
@@ -420,6 +455,10 @@ class TestLongDecimal_class < RUNIT::TestCase
420
455
  check_log_floated(LongDecimal("333.000000000000000000000000919000000000000000000000000000000000001240000000000198"), 91)
421
456
  check_log_floated(LongDecimal("695.000000000000000000000000000000000000016169000000000000000572"), 10)
422
457
  check_log_floated(LongDecimal("553.00000000526000000000000000000000000000000000000000000000000298000000000000000079"), 1)
458
+ check_log_floated(LongDecimal("0.999999991970000064480899482218377157786431422974955673511105941705818652715281320853860023218224705269648462237420298445354478282732556754661276455617"), 38)
459
+ check_log_floated(LongDecimal("473.00000000000000000000000000000000003200056000000000000000000000000000000000000000000664"), 1)
460
+ check_log_floated(LongDecimal("0.0000000000000000000000000000000000081600000000000000000000000000000000007510000886"), 101)
461
+ check_log_floated(LongDecimal("0.99999999999999999999999571850000000000000000001833124224999999999999992151478630572500000000033603444243589176249999856126853469423130083125615992876877728537781582"), 37)
423
462
  end
424
463
 
425
464
  #
@@ -471,6 +510,14 @@ class TestLongDecimal_class < RUNIT::TestCase
471
510
  check_log10_exact(10**0, 0, 30)
472
511
  check_log10_exact(10**1, 1, 30)
473
512
  check_log10_exact(10**10, 10, 30)
513
+
514
+ # random tests that have failed
515
+ check_log10_floated(LongDecimal("587.00000000000000000095700000000000000000000000000000000000000000000000000000000000000000000001206"), 21)
516
+ check_log10_floated(LongDecimal("543.0000002480000900000000000000000000000000000000000000000000000000000000000000000000847"), 2)
517
+ check_log10_floated(LongDecimal("180.0000000000000000003570000000000000000000000000000000000000000000000577000000000000000000000000000637"), 2)
518
+ check_log10_floated(LongDecimal("0.0000000000000000000000000000000000000000180000000063000000000000000000000000000000000025"), 74)
519
+ check_log10_floated(LongDecimal("0.0000000000000000000000000006200000000000000000000000000000000000000000000000007940000015"), 74)
520
+ check_log10_floated(LongDecimal("0.00000000000000000000000000000000000000000032900000000000000000000233000000000000000000000000000000254"), 10)
474
521
  end
475
522
 
476
523
  #
@@ -491,6 +538,12 @@ class TestLongDecimal_class < RUNIT::TestCase
491
538
  check_log2_exact(2**0, 0, 30)
492
539
  check_log2_exact(2**1, 1, 30)
493
540
  check_log2_exact(2**10, 10, 30)
541
+
542
+ # random tests that have failed
543
+ check_log2_floated(LongDecimal("341.00000739000000000000000000000000000000000000000000000000000000000000171"), 3)
544
+ check_log2_floated(LongDecimal("504.00000000000000000000000000000000000000000000000000000000000000000000000000000000000327400000000000828"), 1)
545
+ check_log2_floated(LongDecimal("0.0033222591362126245847176079734219269102990032888157967351353737817463383406363175903135730345286354858609181999523961456225622835123748782987926188031081"), 48)
546
+ check_log2_floated(LongDecimal("0.000802000000000000000000197000000000000000000000302"), 84)
494
547
  end
495
548
 
496
549
 
@@ -1213,6 +1266,88 @@ class TestLongDecimal_class < RUNIT::TestCase
1213
1266
  assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1214
1267
  end
1215
1268
 
1269
+ #
1270
+ # test rounding with ROUND_HALF_CEILING
1271
+ #
1272
+ def test_round_to_scale_half_up
1273
+ l = LongDecimal("2.20")
1274
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1275
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1276
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1277
+ l = LongDecimal("2.21")
1278
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1279
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1280
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1281
+ l = LongDecimal("2.25")
1282
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1283
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1284
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1285
+ l = LongDecimal("2.29")
1286
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1287
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1288
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1289
+ l = LongDecimal("-2.20")
1290
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1291
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1292
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1293
+ l = LongDecimal("-2.21")
1294
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1295
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1296
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1297
+ l = LongDecimal("-2.25")
1298
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1299
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1300
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1301
+ l = LongDecimal("-2.29")
1302
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
1303
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1304
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1305
+ l = LongDecimal("2.24")
1306
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
1307
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1308
+ end
1309
+
1310
+ #
1311
+ # test rounding with ROUND_HALF_FLOOR
1312
+ #
1313
+ def test_round_to_scale_half_down
1314
+ l = LongDecimal("2.20")
1315
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1316
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1317
+ assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1318
+ l = LongDecimal("2.21")
1319
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1320
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1321
+ assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1322
+ l = LongDecimal("2.25")
1323
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1324
+ assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1325
+ assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1326
+ l = LongDecimal("2.29")
1327
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1328
+ assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1329
+ assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1330
+ l = LongDecimal("-2.20")
1331
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1332
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1333
+ assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1334
+ l = LongDecimal("-2.21")
1335
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1336
+ assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1337
+ assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1338
+ l = LongDecimal("-2.25")
1339
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1340
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1341
+ assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1342
+ l = LongDecimal("-2.29")
1343
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
1344
+ assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1345
+ assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
1346
+ l = LongDecimal("2.24")
1347
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
1348
+ assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
1349
+ end
1350
+
1216
1351
  #
1217
1352
  # test rounding with ROUND_HALF_EVEN
1218
1353
  #
@@ -1860,6 +1995,112 @@ class TestLongDecimal_class < RUNIT::TestCase
1860
1995
  assert((zz-z).abs < 1e-9, "z=#{z.inspect}")
1861
1996
  end
1862
1997
 
1998
+ #
1999
+ # test division of LongDecimal with Rational as result
2000
+ #
2001
+ def test_rdiv
2002
+ x = LongDecimal(224, 2)
2003
+
2004
+ y = LongDecimal(3, 1)
2005
+ z = x.rdiv(y)
2006
+ zz = Rational(224, 30)
2007
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2008
+ assert_equal(zz, z, "z=#{z.inspect}")
2009
+ z = y.rdiv(x)
2010
+ zz = Rational(30, 224)
2011
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2012
+ assert_equal(zz, z, "z=#{z.inspect}")
2013
+
2014
+ y = LongDecimal(30000000, 8)
2015
+ z = x.rdiv(y)
2016
+ zz = Rational(224, 30)
2017
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2018
+ assert_equal(zz, z, "z=#{z.inspect}")
2019
+ z = y.rdiv(x)
2020
+ zz = Rational(30, 224)
2021
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2022
+ assert_equal(zz, z, "z=#{z.inspect}")
2023
+
2024
+ y = LongDecimal(3, 4)
2025
+ z = x.rdiv(y)
2026
+ zz = Rational(22400, 3)
2027
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2028
+ assert_equal(zz, z, "z=#{z.inspect}")
2029
+ z = y.rdiv(x)
2030
+ zz = Rational(3, 22400)
2031
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2032
+ assert_equal(zz, z, "z=#{z.inspect}")
2033
+
2034
+ y = LongDecimal(3333, 2)
2035
+ z = x.rdiv(y)
2036
+ zz = Rational(224, 3333)
2037
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2038
+ assert_equal(zz, z, "z=#{z.inspect}")
2039
+ z = y.rdiv(x)
2040
+ zz = Rational(3333, 224)
2041
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2042
+ assert_equal(zz, z, "z=#{z.inspect}")
2043
+
2044
+ y = LongDecimal(33333, 2)
2045
+ z = x.rdiv(y)
2046
+ zz = Rational(224, 33333)
2047
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2048
+ assert_equal(zz, z, "z=#{z.inspect}")
2049
+ z = y.rdiv(x)
2050
+ zz = Rational(33333, 224)
2051
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2052
+ assert_equal(zz, z, "z=#{z.inspect}")
2053
+
2054
+ y = LongDecimal(33333, 3)
2055
+ z = x.rdiv(y)
2056
+ zz = Rational(2240, 33333)
2057
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2058
+ assert_equal(zz, z, "z=#{z.inspect}")
2059
+ z = y.rdiv(x)
2060
+ zz = Rational(33333, 2240)
2061
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2062
+ assert_equal(zz, z, "z=#{z.inspect}")
2063
+
2064
+ y = LongDecimal(3333, 3)
2065
+ z = x.rdiv(y)
2066
+ zz = Rational(2240, 3333)
2067
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2068
+ assert_equal(zz, z, "z=#{z.inspect}")
2069
+ z = y.rdiv(x)
2070
+ zz = Rational(3333, 2240)
2071
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2072
+ assert_equal(zz, z, "z=#{z.inspect}")
2073
+
2074
+ y = LongDecimal(123456789, 3)
2075
+ z = x.rdiv(y)
2076
+ zz = Rational(2240, 123456789)
2077
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2078
+ assert_equal(zz, z, "z=#{z.inspect}")
2079
+ z = y.rdiv(x)
2080
+ zz = Rational(123456789, 2240)
2081
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2082
+ assert_equal(zz, z, "z=#{z.inspect}")
2083
+
2084
+ y = 5
2085
+ z = x.rdiv(y)
2086
+ zz = Rational(224, 500)
2087
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2088
+ assert_equal(zz, z, "z=#{z.inspect}")
2089
+
2090
+ y = 5.001
2091
+ z = x.rdiv(y)
2092
+ zz = Rational(224, 500)
2093
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2094
+ assert_equal(zz, z, "z=#{z.inspect}")
2095
+
2096
+ y = Rational(5, 3)
2097
+ z = x.rdiv(y)
2098
+ zz = Rational(224*3, 500)
2099
+ assert_kind_of(Rational, z, "z=#{z.inspect}")
2100
+ assert_equal(zz, z, "z=#{z.inspect}")
2101
+
2102
+ end
2103
+
1863
2104
  #
1864
2105
  # test square of LongDecimal
1865
2106
  #
@@ -2769,6 +3010,49 @@ class TestLongDecimal_class < RUNIT::TestCase
2769
3010
  assert_equal(zz, z, "225/2240")
2770
3011
  end
2771
3012
 
3013
+ #
3014
+ # test sint_digits10 of LongDecimalQuot
3015
+ #
3016
+ def test_ldq_sint_digits10
3017
+ assert_equal(nil, LongDecimalQuot(LongDecimal("0.0000"), 1.to_ld).sint_digits10, "0.0000")
3018
+ assert_equal(-3, LongDecimalQuot(LongDecimal("0.0009"), 1.to_ld).sint_digits10, "0.0009")
3019
+ assert_equal(-2, LongDecimalQuot(LongDecimal("0.0099"), 1.to_ld).sint_digits10, "0.0099")
3020
+ assert_equal(-1, LongDecimalQuot(LongDecimal("0.0999"), 1.to_ld).sint_digits10, "0.0999")
3021
+ assert_equal(0, LongDecimalQuot(LongDecimal("0.9999"), 1.to_ld).sint_digits10, "0.9999")
3022
+ assert_equal(1, LongDecimalQuot(LongDecimal("1.0000"), 1.to_ld).sint_digits10, "1.0000")
3023
+ assert_equal(1, LongDecimalQuot(LongDecimal("9.9999"), 1.to_ld).sint_digits10, "9.9999")
3024
+ assert_equal(2, LongDecimalQuot(LongDecimal("10.0000"), 1.to_ld).sint_digits10, "10.0000")
3025
+ assert_equal(2, LongDecimalQuot(LongDecimal("99.9999"), 1.to_ld).sint_digits10, "99.9999")
3026
+ assert_equal(3, LongDecimalQuot(LongDecimal("100.0000"), 1.to_ld).sint_digits10, "100.0000")
3027
+ assert_equal(3, LongDecimalQuot(LongDecimal("999.9999"), 1.to_ld).sint_digits10, "999.9999")
3028
+
3029
+ assert_equal(nil, LongDecimalQuot(LongDecimal("-0.0000"), 1.to_ld).sint_digits10, "-0.0000")
3030
+ assert_equal(0, LongDecimalQuot(LongDecimal("-0.9999"), 1.to_ld).sint_digits10, "-0.9999")
3031
+ assert_equal(1, LongDecimalQuot(LongDecimal("-1.0000"), 1.to_ld).sint_digits10, "-1.0000")
3032
+ assert_equal(1, LongDecimalQuot(LongDecimal("-9.9999"), 1.to_ld).sint_digits10, "-9.9999")
3033
+ assert_equal(2, LongDecimalQuot(LongDecimal("-10.0000"), 1.to_ld).sint_digits10, "-10.0000")
3034
+ assert_equal(2, LongDecimalQuot(LongDecimal("-99.9999"), 1.to_ld).sint_digits10, "-99.9999")
3035
+ assert_equal(3, LongDecimalQuot(LongDecimal("-100.0000"), 1.to_ld).sint_digits10, "-100.0000")
3036
+ assert_equal(3, LongDecimalQuot(LongDecimal("-999.9999"), 1.to_ld).sint_digits10, "-999.9999")
3037
+ x = LongDecimalQuot(1234.to_ld, 1.to_ld)
3038
+ assert_equal(4, x.sint_digits10, "1234")
3039
+ assert_equal(4, x.sint_digits10, "1234")
3040
+ x = LongDecimalQuot(1234.to_ld(10), 1.to_ld)
3041
+ assert_equal(4, x.sint_digits10, "1234")
3042
+ assert_equal(4, x.sint_digits10, "1234")
3043
+
3044
+ 10.times do |i|
3045
+ f = 1
3046
+ g = 1
3047
+ n = (i*i+i)/2
3048
+ f, g = g, f+g
3049
+ x = LongDecimal(Rational((n+1)*f, (n+2)*g), 3*i)
3050
+ y = 1/x
3051
+ assert_equal(x.to_r.to_ld.sint_digits10(), x.sint_digits10(), "x=#{x} f=#{f} g=#{g} i=#{i} n=#{n}")
3052
+ assert_equal(y.to_r.to_ld.sint_digits10(), y.sint_digits10(), "y=#{y} f=#{f} g=#{g} i=#{i} n=#{n}")
3053
+ end
3054
+ end
3055
+
2772
3056
  #
2773
3057
  # test rounding of LongDecimalQuot with ROUND_UP
2774
3058
  #
@@ -2950,6 +3234,11 @@ class TestLongDecimal_class < RUNIT::TestCase
2950
3234
  assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2951
3235
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
2952
3236
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3237
+ l = LongDecimalQuot(Rational(-225, 4), 0)
3238
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
3239
+ assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3240
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3241
+ assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2953
3242
  end
2954
3243
 
2955
3244
  #
@@ -2991,6 +3280,103 @@ class TestLongDecimal_class < RUNIT::TestCase
2991
3280
  assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
2992
3281
  assert_kind_of(LongDecimal, r, "must be LongDecimal")
2993
3282
  assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3283
+ l = LongDecimalQuot(Rational(-225, 4), 0)
3284
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
3285
+ assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3286
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3287
+ assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3288
+ end
3289
+
3290
+ #
3291
+ # test rounding of LongDecimalQuot with ROUND_HALF_CEILING
3292
+ #
3293
+ def test_ldq_round_to_scale_half_ceiling
3294
+
3295
+ # 0.99555555555555...
3296
+ l = LongDecimalQuot(Rational(224, 225), 0)
3297
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3298
+ assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3299
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3300
+ assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3301
+ l = LongDecimalQuot(-Rational(224, 225), 0)
3302
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3303
+ assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3304
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3305
+ assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3306
+ # 0.00444444444444444
3307
+ l = LongDecimalQuot(Rational(1, 225), 0)
3308
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3309
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3310
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3311
+ assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3312
+ l = LongDecimalQuot(Rational(-1, 225), 0)
3313
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3314
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3315
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3316
+ assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3317
+ l = LongDecimalQuot(Rational(1, 1), 1000)
3318
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
3319
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3320
+ l = LongDecimalQuot(Rational(1, 1), 1)
3321
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
3322
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3323
+ # 56.25
3324
+ l = LongDecimalQuot(Rational(225, 4), 0)
3325
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3326
+ assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3327
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3328
+ assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3329
+ l = LongDecimalQuot(Rational(-225, 4), 0)
3330
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
3331
+ assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3332
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3333
+ assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3334
+ end
3335
+
3336
+ #
3337
+ # test rounding of LongDecimalQuot with ROUND_HALF_FLOOR
3338
+ #
3339
+ def test_ldq_round_to_scale_half_floor
3340
+
3341
+ # 0.99555555555555...
3342
+ l = LongDecimalQuot(Rational(224, 225), 0)
3343
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3344
+ assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3345
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3346
+ assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3347
+ l = LongDecimalQuot(-Rational(224, 225), 0)
3348
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3349
+ assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3350
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3351
+ assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3352
+ # 0.00444444444444444
3353
+ l = LongDecimalQuot(Rational(1, 225), 0)
3354
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3355
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3356
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3357
+ assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3358
+ l = LongDecimalQuot(Rational(-1, 225), 0)
3359
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3360
+ assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3361
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3362
+ assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3363
+ l = LongDecimalQuot(Rational(1, 1), 1000)
3364
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
3365
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3366
+ l = LongDecimalQuot(Rational(1, 1), 1)
3367
+ r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
3368
+ assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3369
+ # 56.25
3370
+ l = LongDecimalQuot(Rational(225, 4), 0)
3371
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3372
+ assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3373
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3374
+ assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
3375
+ l = LongDecimalQuot(Rational(-225, 4), 0)
3376
+ r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
3377
+ assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
3378
+ assert_kind_of(LongDecimal, r, "must be LongDecimal")
3379
+ assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
2994
3380
  end
2995
3381
 
2996
3382
  #
@@ -3769,6 +4155,65 @@ class TestLongDecimal_class < RUNIT::TestCase
3769
4155
  assert_equal(x, x, "x equals x")
3770
4156
  assert_equal(y, y, "y equals y")
3771
4157
  end
4158
+
4159
+ #
4160
+ # test inverse of RoundingMode
4161
+ #
4162
+ def test_rm_inverse
4163
+ assert_equal(LongMath::ROUND_UP, LongMath::ROUND_DOWN.inverse)
4164
+ assert_equal(LongMath::ROUND_DOWN, LongMath::ROUND_UP.inverse)
4165
+ assert_equal(LongMath::ROUND_CEILING, LongMath::ROUND_FLOOR.inverse)
4166
+ assert_equal(LongMath::ROUND_FLOOR, LongMath::ROUND_CEILING.inverse)
4167
+ assert_equal(LongMath::ROUND_HALF_UP, LongMath::ROUND_HALF_DOWN.inverse)
4168
+ assert_equal(LongMath::ROUND_HALF_DOWN, LongMath::ROUND_HALF_UP.inverse)
4169
+ assert_equal(LongMath::ROUND_HALF_CEILING, LongMath::ROUND_HALF_FLOOR.inverse)
4170
+ assert_equal(LongMath::ROUND_HALF_FLOOR, LongMath::ROUND_HALF_CEILING.inverse)
4171
+ assert_equal(LongMath::ROUND_HALF_EVEN, LongMath::ROUND_HALF_EVEN.inverse)
4172
+ assert_equal(LongMath::ROUND_UNNECESSARY, LongMath::ROUND_UNNECESSARY.inverse)
4173
+ end
4174
+
4175
+
4176
+ def test_scale_equal
4177
+ x = LongDecimal(3, 9)
4178
+ y = LongDecimal(4, 9)
4179
+ z = LongDecimal(4, 8)
4180
+ assert(x.scale_equal(y), "xy")
4181
+ assert(y.scale_equal(x), "yx")
4182
+ assert(! x.scale_equal(z), "xz")
4183
+ assert(! y.scale_equal(z), "yz")
4184
+
4185
+ x = LongDecimalQuot(Rational(3, 4), 9)
4186
+ y = LongDecimalQuot(Rational(4, 3), 9)
4187
+ z = LongDecimalQuot(Rational(4, 3), 8)
4188
+ assert(x.scale_equal(y), "xy")
4189
+ assert(y.scale_equal(x), "yx")
4190
+ assert(! x.scale_equal(z), "xz")
4191
+ assert(! y.scale_equal(z), "yz")
4192
+ assert(! z.scale_equal(x), "zx")
4193
+ assert(! z.scale_equal(y), "zy")
4194
+ end
4195
+
4196
+ def test_scale_ufo
4197
+ x = LongDecimal(3, 9)
4198
+ y = LongDecimal(4, 9)
4199
+ z = LongDecimal(4, 7)
4200
+ assert(x.scale_ufo(y) == 0, "xy")
4201
+ assert(y.scale_ufo(x) == 0, "yx")
4202
+ assert(x.scale_ufo(z) == 1, "xz")
4203
+ assert(y.scale_ufo(z) == 1, "yz")
4204
+ assert(z.scale_ufo(x) == -1, "zx")
4205
+ assert(z.scale_ufo(y) == -1, "zy")
4206
+
4207
+ x = LongDecimalQuot(Rational(3, 4), 9)
4208
+ y = LongDecimalQuot(Rational(4, 3), 9)
4209
+ z = LongDecimalQuot(Rational(4, 3), 7)
4210
+ assert(x.scale_ufo(y) == 0, "xy")
4211
+ assert(y.scale_ufo(x) == 0, "yx")
4212
+ assert(x.scale_ufo(z) == 1, "xz")
4213
+ assert(y.scale_ufo(z) == 1, "yz")
4214
+ assert(z.scale_ufo(x) == -1, "zx")
4215
+ assert(z.scale_ufo(y) == -1, "zy")
4216
+ end
3772
4217
 
3773
4218
  end
3774
4219