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
@@ -103,7 +103,7 @@ internal rounding mode (mode)
103
103
  <h3 class="section-bar">Methods</h3>
104
104
 
105
105
  <div class="name-list">
106
- <a href="#M000149">&lt;=&gt;</a>&nbsp;&nbsp;
106
+ <a href="#M000155">&lt;=&gt;</a>&nbsp;&nbsp;
107
107
  </div>
108
108
  </div>
109
109
 
@@ -132,12 +132,12 @@ internal rounding mode (mode)
132
132
  <div id="methods">
133
133
  <h3 class="section-bar">Public Instance methods</h3>
134
134
 
135
- <div id="method-M000149" class="method-detail">
136
- <a name="M000149"></a>
135
+ <div id="method-M000155" class="method-detail">
136
+ <a name="M000155"></a>
137
137
 
138
138
  <div class="method-heading">
139
- <a href="CacheKey.src/M000149.html" target="Code" class="method-signature"
140
- onclick="popupCode('CacheKey.src/M000149.html');return false;">
139
+ <a href="CacheKey.src/M000155.html" target="Code" class="method-signature"
140
+ onclick="popupCode('CacheKey.src/M000155.html');return false;">
141
141
  <span class="method-name">&lt;=&gt;</span><span class="method-args">(o)</span>
142
142
  </a>
143
143
  </div>
@@ -101,8 +101,8 @@
101
101
  <h3 class="section-bar">Methods</h3>
102
102
 
103
103
  <div class="name-list">
104
- <a href="#M000105">one?</a>&nbsp;&nbsp;
105
- <a href="#M000104">to_ld</a>&nbsp;&nbsp;
104
+ <a href="#M000106">one?</a>&nbsp;&nbsp;
105
+ <a href="#M000105">to_ld</a>&nbsp;&nbsp;
106
106
  </div>
107
107
  </div>
108
108
 
@@ -124,12 +124,12 @@
124
124
  <div id="methods">
125
125
  <h3 class="section-bar">Public Instance methods</h3>
126
126
 
127
- <div id="method-M000105" class="method-detail">
128
- <a name="M000105"></a>
127
+ <div id="method-M000106" class="method-detail">
128
+ <a name="M000106"></a>
129
129
 
130
130
  <div class="method-heading">
131
- <a href="Numeric.src/M000105.html" target="Code" class="method-signature"
132
- onclick="popupCode('Numeric.src/M000105.html');return false;">
131
+ <a href="Numeric.src/M000106.html" target="Code" class="method-signature"
132
+ onclick="popupCode('Numeric.src/M000106.html');return false;">
133
133
  <span class="method-name">one?</span><span class="method-args">()</span>
134
134
  </a>
135
135
  </div>
@@ -141,13 +141,13 @@ test if 1 (like zero?)
141
141
  </div>
142
142
  </div>
143
143
 
144
- <div id="method-M000104" class="method-detail">
145
- <a name="M000104"></a>
144
+ <div id="method-M000105" class="method-detail">
145
+ <a name="M000105"></a>
146
146
 
147
147
  <div class="method-heading">
148
- <a href="Numeric.src/M000104.html" target="Code" class="method-signature"
149
- onclick="popupCode('Numeric.src/M000104.html');return false;">
150
- <span class="method-name">to_ld</span><span class="method-args">(prec = nil, mode = LongDecimal::ROUND_HALF_UP)</span>
148
+ <a href="Numeric.src/M000105.html" target="Code" class="method-signature"
149
+ onclick="popupCode('Numeric.src/M000105.html');return false;">
150
+ <span class="method-name">to_ld</span><span class="method-args">(prec = nil, mode = LongMath.standard_mode)</span>
151
151
  </a>
152
152
  </div>
153
153
 
@@ -5,14 +5,19 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>one? (Numeric)</title>
8
+ <title>to_ld (Numeric)</title>
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
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 1797</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">one?</span>
15
- (<span class="ruby-keyword kw">self</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>).<span class="ruby-identifier">zero?</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1829</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>)
15
+ <span class="ruby-identifier">l</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-keyword kw">self</span>)
16
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">prec</span>.<span class="ruby-identifier">nil?</span>)
17
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">l</span>
18
+ <span class="ruby-keyword kw">else</span>
19
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">l</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
20
+ <span class="ruby-keyword kw">end</span>
16
21
  <span class="ruby-keyword kw">end</span></pre>
17
22
  </body>
18
23
  </html>
@@ -101,7 +101,7 @@
101
101
  <h3 class="section-bar">Methods</h3>
102
102
 
103
103
  <div class="name-list">
104
- <a href="#M000106">to_ld</a>&nbsp;&nbsp;
104
+ <a href="#M000107">to_ld</a>&nbsp;&nbsp;
105
105
  </div>
106
106
  </div>
107
107
 
@@ -123,13 +123,13 @@
123
123
  <div id="methods">
124
124
  <h3 class="section-bar">Public Instance methods</h3>
125
125
 
126
- <div id="method-M000106" class="method-detail">
127
- <a name="M000106"></a>
126
+ <div id="method-M000107" class="method-detail">
127
+ <a name="M000107"></a>
128
128
 
129
129
  <div class="method-heading">
130
- <a href="Rational.src/M000106.html" target="Code" class="method-signature"
131
- onclick="popupCode('Rational.src/M000106.html');return false;">
132
- <span class="method-name">to_ld</span><span class="method-args">(prec = nil, mode = LongDecimal::ROUND_HALF_UP)</span>
130
+ <a href="Rational.src/M000107.html" target="Code" class="method-signature"
131
+ onclick="popupCode('Rational.src/M000107.html');return false;">
132
+ <span class="method-name">to_ld</span><span class="method-args">(prec = nil, mode = LongMath.standard_mode)</span>
133
133
  </a>
134
134
  </div>
135
135
 
@@ -1 +1 @@
1
- Tue Apr 11 22:08:00 CEST 2006
1
+ Mon May 01 14:50:14 CEST 2006
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Tue Apr 11 22:02:00 CEST 2006</td>
59
+ <td>Mon May 01 14:50:04 CEST 2006</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -90,7 +90,7 @@ point
90
90
  </p>
91
91
  <p>
92
92
  CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v
93
- 1.33 2006/04/11 19:03:22 bk1 Exp $ CVS-Label: $Name: ALPHA_01_00 $ Author:
93
+ 1.43 2006/05/01 12:22:12 bk1 Exp $ CVS-Label: $Name: ALPHA_01_01 $ Author:
94
94
  $Author: bk1 $ (Karl Brodowsky)
95
95
  </p>
96
96
 
@@ -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 1760</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1804</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 1773</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1817</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>
@@ -20,158 +20,165 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/LongDecimal.html#M000076">% (LongDecimal)</a><br />
24
23
  <a href="classes/LongDecimalQuot.html#M000023">% (LongDecimalQuot)</a><br />
25
- <a href="classes/LongDecimal.html#M000077">& (LongDecimal)</a><br />
26
- <a href="classes/LongDecimal.html#M000069">* (LongDecimal)</a><br />
24
+ <a href="classes/LongDecimal.html#M000077">% (LongDecimal)</a><br />
25
+ <a href="classes/LongDecimal.html#M000078">& (LongDecimal)</a><br />
26
+ <a href="classes/LongDecimal.html#M000070">* (LongDecimal)</a><br />
27
27
  <a href="classes/LongDecimalQuot.html#M000019">* (LongDecimalQuot)</a><br />
28
+ <a href="classes/LongDecimal.html#M000075">** (LongDecimal)</a><br />
28
29
  <a href="classes/LongDecimalQuot.html#M000021">** (LongDecimalQuot)</a><br />
29
- <a href="classes/LongDecimal.html#M000074">** (LongDecimal)</a><br />
30
+ <a href="classes/LongDecimal.html#M000068">+ (LongDecimal)</a><br />
30
31
  <a href="classes/LongDecimalQuot.html#M000017">+ (LongDecimalQuot)</a><br />
31
- <a href="classes/LongDecimal.html#M000067">+ (LongDecimal)</a><br />
32
- <a href="classes/LongDecimalBase.html#M000110">+@ (LongDecimalBase)</a><br />
33
- <a href="classes/LongDecimal.html#M000068">- (LongDecimal)</a><br />
32
+ <a href="classes/LongDecimalBase.html#M000111">+@ (LongDecimalBase)</a><br />
33
+ <a href="classes/LongDecimal.html#M000069">- (LongDecimal)</a><br />
34
34
  <a href="classes/LongDecimalQuot.html#M000018">- (LongDecimalQuot)</a><br />
35
- <a href="classes/LongDecimal.html#M000066">-@ (LongDecimal)</a><br />
36
35
  <a href="classes/LongDecimalQuot.html#M000016">-@ (LongDecimalQuot)</a><br />
37
- <a href="classes/LongDecimal.html#M000073">/ (LongDecimal)</a><br />
36
+ <a href="classes/LongDecimal.html#M000067">-@ (LongDecimal)</a><br />
37
+ <a href="classes/LongDecimal.html#M000074">/ (LongDecimal)</a><br />
38
38
  <a href="classes/LongDecimalQuot.html#M000020">/ (LongDecimalQuot)</a><br />
39
- <a href="classes/LongDecimal.html#M000081"><< (LongDecimal)</a><br />
40
- <a href="classes/LongDecimalBase.html#M000115"><=> (LongDecimalBase)</a><br />
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
- <a href="classes/LongDecimal.html#M000098">== (LongDecimal)</a><br />
39
+ <a href="classes/LongDecimal.html#M000082"><< (LongDecimal)</a><br />
40
+ <a href="classes/LongDecimalBase.html#M000116"><=> (LongDecimalBase)</a><br />
41
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000156"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
42
+ <a href="classes/LongMath/CacheKey.html#M000155"><=> (LongMath::CacheKey)</a><br />
43
+ <a href="classes/LongDecimal.html#M000099">== (LongDecimal)</a><br />
44
44
  <a href="classes/LongDecimalQuot.html#M000027">== (LongDecimalQuot)</a><br />
45
- <a href="classes/LongDecimal.html#M000099">=== (LongDecimal)</a><br />
46
- <a href="classes/LongDecimal.html#M000082">>> (LongDecimal)</a><br />
45
+ <a href="classes/LongDecimal.html#M000100">=== (LongDecimal)</a><br />
46
+ <a href="classes/LongDecimal.html#M000083">>> (LongDecimal)</a><br />
47
47
  <a href="files/lib/long-decimal_rb.html#M000001">LongDecimal (lib/long-decimal.rb)</a><br />
48
48
  <a href="files/lib/long-decimal_rb.html#M000002">LongDecimalQuot (lib/long-decimal.rb)</a><br />
49
- <a href="classes/LongDecimal.html#M000083">[] (LongDecimal)</a><br />
50
- <a href="classes/LongDecimal.html#M000079">^ (LongDecimal)</a><br />
51
- <a href="classes/LongDecimal.html#M000092">abs (LongDecimal)</a><br />
49
+ <a href="classes/LongDecimal.html#M000084">[] (LongDecimal)</a><br />
50
+ <a href="classes/LongDecimal.html#M000080">^ (LongDecimal)</a><br />
52
51
  <a href="classes/LongDecimalQuot.html#M000024">abs (LongDecimalQuot)</a><br />
53
- <a href="classes/LongDecimalBase.html#M000114">abs2 (LongDecimalBase)</a><br />
52
+ <a href="classes/LongDecimal.html#M000093">abs (LongDecimal)</a><br />
53
+ <a href="classes/LongDecimalBase.html#M000115">abs2 (LongDecimalBase)</a><br />
54
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000158">ainverse (LongDecimalRoundingMode::RoundingModeClass)</a><br />
54
55
  <a href="classes/LongDecimal.html#M000059">anti_equalize_scale (LongDecimal)</a><br />
55
- <a href="classes/LongMath.html#M000146">calc_iprec_for_power (LongMath)</a><br />
56
- <a href="classes/LongMath.html#M000119">check_is_int (LongMath)</a><br />
57
- <a href="classes/LongMath.html#M000120">check_is_ld (LongMath)</a><br />
58
- <a href="classes/LongMath.html#M000122">check_is_mode (LongMath)</a><br />
59
- <a href="classes/LongMath.html#M000121">check_is_prec (LongMath)</a><br />
60
- <a href="classes/LongMath.html#M000118">check_word_len (LongMath)</a><br />
56
+ <a href="classes/LongMath.html#M000147">calc_iprec_for_power (LongMath)</a><br />
57
+ <a href="classes/LongMath.html#M000120">check_is_int (LongMath)</a><br />
58
+ <a href="classes/LongMath.html#M000121">check_is_ld (LongMath)</a><br />
59
+ <a href="classes/LongMath.html#M000123">check_is_mode (LongMath)</a><br />
60
+ <a href="classes/LongMath.html#M000122">check_is_prec (LongMath)</a><br />
61
+ <a href="classes/LongMath.html#M000119">check_word_len (LongMath)</a><br />
61
62
  <a href="classes/LongDecimalQuot.html#M000026">coerce (LongDecimalQuot)</a><br />
62
- <a href="classes/LongDecimal.html#M000093">coerce (LongDecimal)</a><br />
63
- <a href="classes/LongDecimalBase.html#M000109">dec (LongDecimalBase)</a><br />
64
- <a href="classes/LongDecimal.html#M000064">dec! (LongDecimal)</a><br />
63
+ <a href="classes/LongDecimal.html#M000094">coerce (LongDecimal)</a><br />
64
+ <a href="classes/LongDecimalBase.html#M000110">dec (LongDecimalBase)</a><br />
65
65
  <a href="classes/LongDecimalQuot.html#M000015">dec! (LongDecimalQuot)</a><br />
66
+ <a href="classes/LongDecimal.html#M000064">dec! (LongDecimal)</a><br />
66
67
  <a href="classes/LongDecimalQuot.html#M000006">denominator (LongDecimalQuot)</a><br />
67
68
  <a href="classes/LongDecimal.html#M000054">denominator (LongDecimal)</a><br />
68
- <a href="classes/LongDecimal.html#M000070">divide (LongDecimal)</a><br />
69
- <a href="classes/LongDecimal.html#M000071">divide_s (LongDecimal)</a><br />
69
+ <a href="classes/LongDecimal.html#M000071">divide (LongDecimal)</a><br />
70
+ <a href="classes/LongDecimal.html#M000072">divide_s (LongDecimal)</a><br />
71
+ <a href="classes/LongDecimal.html#M000076">divmod (LongDecimal)</a><br />
70
72
  <a href="classes/LongDecimalQuot.html#M000022">divmod (LongDecimalQuot)</a><br />
71
- <a href="classes/LongDecimal.html#M000075">divmod (LongDecimal)</a><br />
72
73
  <a href="classes/LongDecimal.html#M000058">equalize_scale (LongDecimal)</a><br />
73
- <a href="classes/LongMath.html#M000134">exp (LongMath)</a><br />
74
- <a href="classes/LongMath.html#M000136">exp10 (LongMath)</a><br />
75
- <a href="classes/LongMath.html#M000135">exp2 (LongMath)</a><br />
76
- <a href="classes/LongMath.html#M000137">exp_internal (LongMath)</a><br />
77
- <a href="classes/LongMath.html#M000138">exp_raw (LongMath)</a><br />
78
- <a href="classes/LongMath.html#M000129">gcd_with_high_power (LongMath)</a><br />
74
+ <a href="classes/LongMath.html#M000135">exp (LongMath)</a><br />
75
+ <a href="classes/LongMath.html#M000137">exp10 (LongMath)</a><br />
76
+ <a href="classes/LongMath.html#M000136">exp2 (LongMath)</a><br />
77
+ <a href="classes/LongMath.html#M000138">exp_internal (LongMath)</a><br />
78
+ <a href="classes/LongMath.html#M000139">exp_raw (LongMath)</a><br />
79
+ <a href="classes/LongMath.html#M000130">gcd_with_high_power (LongMath)</a><br />
80
+ <a href="classes/LongDecimal.html#M000103">hash (LongDecimal)</a><br />
79
81
  <a href="classes/LongDecimalQuot.html#M000034">hash (LongDecimalQuot)</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
- <a href="classes/LongDecimalBase.html#M000108">inc (LongDecimalBase)</a><br />
83
- <a href="classes/LongDecimalQuot.html#M000014">inc! (LongDecimalQuot)</a><br />
82
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000159">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
83
+ <a href="classes/LongDecimalBase.html#M000109">inc (LongDecimalBase)</a><br />
84
84
  <a href="classes/LongDecimal.html#M000063">inc! (LongDecimal)</a><br />
85
- <a href="classes/LongDecimal.html#M000103">inspect (LongDecimal)</a><br />
85
+ <a href="classes/LongDecimalQuot.html#M000014">inc! (LongDecimalQuot)</a><br />
86
86
  <a href="classes/LongDecimalQuot.html#M000035">inspect (LongDecimalQuot)</a><br />
87
- <a href="classes/LongMath.html#M000132">int_digits10 (LongMath)</a><br />
87
+ <a href="classes/LongDecimal.html#M000104">inspect (LongDecimal)</a><br />
88
+ <a href="classes/LongMath.html#M000133">int_digits10 (LongMath)</a><br />
88
89
  <a href="classes/LongDecimal.html#M000057">int_digits10 (LongDecimal)</a><br />
89
90
  <a href="classes/LongDecimal.html#M000055">int_digits2 (LongDecimal)</a><br />
90
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000151">inverse (LongDecimalRoundingMode::RoundingModeClass)</a><br />
91
- <a href="classes/LongDecimalBase.html#M000113">inverse (LongDecimalBase)</a><br />
91
+ <a href="classes/LongDecimalBase.html#M000114">inverse (LongDecimalBase)</a><br />
92
+ <a href="classes/LongMath.html#M000149">ipower (LongMath)</a><br />
93
+ <a href="classes/LongDecimal.html#M000095">is_int? (LongDecimal)</a><br />
92
94
  <a href="classes/LongDecimalQuot.html#M000030">is_int? (LongDecimalQuot)</a><br />
93
- <a href="classes/LongDecimal.html#M000094">is_int? (LongDecimal)</a><br />
94
- <a href="classes/LongMath.html#M000141">log (LongMath)</a><br />
95
- <a href="classes/LongMath.html#M000142">log10 (LongMath)</a><br />
96
- <a href="classes/LongMath.html#M000143">log2 (LongMath)</a><br />
97
- <a href="classes/LongMath.html#M000144">log_internal (LongMath)</a><br />
98
- <a href="classes/LongMath.html#M000145">log_raw (LongMath)</a><br />
99
- <a href="classes/LongMath.html#M000124">merge_from_words (LongMath)</a><br />
95
+ <a href="classes/LongMath.html#M000142">log (LongMath)</a><br />
96
+ <a href="classes/LongMath.html#M000143">log10 (LongMath)</a><br />
97
+ <a href="classes/LongMath.html#M000144">log2 (LongMath)</a><br />
98
+ <a href="classes/LongMath.html#M000145">log_internal (LongMath)</a><br />
99
+ <a href="classes/LongMath.html#M000146">log_raw (LongMath)</a><br />
100
+ <a href="classes/LongMath.html#M000125">merge_from_words (LongMath)</a><br />
100
101
  <a href="classes/LongDecimal.html#M000041">minus_one! (LongDecimal)</a><br />
101
- <a href="classes/LongDecimal.html#M000085">move_point_left (LongDecimal)</a><br />
102
- <a href="classes/LongDecimal.html#M000087">move_point_left_int (LongDecimal)</a><br />
103
- <a href="classes/LongDecimal.html#M000086">move_point_right (LongDecimal)</a><br />
104
- <a href="classes/LongDecimal.html#M000088">move_point_right_int (LongDecimal)</a><br />
105
- <a href="classes/LongMath.html#M000131">multiplicity_of_10 (LongMath)</a><br />
106
- <a href="classes/LongMath.html#M000130">multiplicity_of_factor (LongMath)</a><br />
102
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000157">minverse (LongDecimalRoundingMode::RoundingModeClass)</a><br />
103
+ <a href="classes/LongDecimal.html#M000086">move_point_left (LongDecimal)</a><br />
104
+ <a href="classes/LongDecimal.html#M000088">move_point_left_int (LongDecimal)</a><br />
105
+ <a href="classes/LongDecimal.html#M000087">move_point_right (LongDecimal)</a><br />
106
+ <a href="classes/LongDecimal.html#M000089">move_point_right_int (LongDecimal)</a><br />
107
+ <a href="classes/LongMath.html#M000132">multiplicity_of_10 (LongMath)</a><br />
108
+ <a href="classes/LongMath.html#M000131">multiplicity_of_factor (LongMath)</a><br />
107
109
  <a href="classes/LongDecimal.html#M000043">new (LongDecimal)</a><br />
108
110
  <a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
109
- <a href="classes/LongDecimal.html#M000036">new! (LongDecimal)</a><br />
110
111
  <a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
112
+ <a href="classes/LongDecimal.html#M000036">new! (LongDecimal)</a><br />
111
113
  <a href="classes/LongDecimal.html#M000061">next (LongDecimal)</a><br />
112
114
  <a href="classes/LongDecimalQuot.html#M000005">numerator (LongDecimalQuot)</a><br />
113
115
  <a href="classes/LongDecimal.html#M000038">one! (LongDecimal)</a><br />
114
- <a href="classes/Numeric.html#M000105">one? (Numeric)</a><br />
116
+ <a href="classes/LongDecimal.html#M000102">one? (LongDecimal)</a><br />
117
+ <a href="classes/Numeric.html#M000106">one? (Numeric)</a><br />
115
118
  <a href="classes/LongDecimalQuot.html#M000029">one? (LongDecimalQuot)</a><br />
116
- <a href="classes/LongDecimal.html#M000101">one? (LongDecimal)</a><br />
117
- <a href="classes/LongMath.html#M000133">pi (LongMath)</a><br />
118
- <a href="classes/LongMath.html#M000147">power (LongMath)</a><br />
119
- <a href="classes/LongMath.html#M000148">power_internal (LongMath)</a><br />
119
+ <a href="classes/LongMath.html#M000134">pi (LongMath)</a><br />
120
+ <a href="classes/LongMath.html#M000148">power (LongMath)</a><br />
121
+ <a href="classes/LongMath.html#M000150">power_internal (LongMath)</a><br />
120
122
  <a href="classes/LongDecimal.html#M000042">power_of_ten! (LongDecimal)</a><br />
121
123
  <a href="classes/LongDecimal.html#M000062">pred (LongDecimal)</a><br />
122
- <a href="classes/LongDecimal.html#M000072">rdiv (LongDecimal)</a><br />
123
- <a href="classes/LongDecimalBase.html#M000112">reciprocal (LongDecimalBase)</a><br />
124
+ <a href="classes/LongDecimal.html#M000073">rdiv (LongDecimal)</a><br />
125
+ <a href="classes/LongDecimalBase.html#M000113">reciprocal (LongDecimalBase)</a><br />
124
126
  <a href="classes/LongDecimal.html#M000046">round_to_scale (LongDecimal)</a><br />
125
127
  <a href="classes/LongDecimalQuot.html#M000025">round_to_scale (LongDecimalQuot)</a><br />
126
128
  <a href="classes/LongDecimal.html#M000045">round_trailing_zeros (LongDecimal)</a><br />
127
- <a href="classes/LongDecimal.html#M000044">scale= (LongDecimal)</a><br />
128
129
  <a href="classes/LongDecimalQuot.html#M000007">scale= (LongDecimalQuot)</a><br />
129
- <a href="classes/LongDecimalBase.html#M000117">scale_equal (LongDecimalBase)</a><br />
130
- <a href="classes/LongDecimalBase.html#M000116">scale_ufo (LongDecimalBase)</a><br />
131
- <a href="classes/LongDecimal.html#M000095">sgn (LongDecimal)</a><br />
130
+ <a href="classes/LongDecimal.html#M000044">scale= (LongDecimal)</a><br />
131
+ <a href="classes/LongDecimalBase.html#M000118">scale_equal (LongDecimalBase)</a><br />
132
+ <a href="classes/LongDecimalBase.html#M000117">scale_ufo (LongDecimalBase)</a><br />
133
+ <a href="classes/LongDecimal.html#M000096">sgn (LongDecimal)</a><br />
132
134
  <a href="classes/LongDecimalQuot.html#M000031">sgn (LongDecimalQuot)</a><br />
133
- <a href="classes/LongDecimal.html#M000097">sign (LongDecimal)</a><br />
135
+ <a href="classes/LongDecimal.html#M000098">sign (LongDecimal)</a><br />
134
136
  <a href="classes/LongDecimalQuot.html#M000033">sign (LongDecimalQuot)</a><br />
135
- <a href="classes/LongDecimal.html#M000096">signum (LongDecimal)</a><br />
136
137
  <a href="classes/LongDecimalQuot.html#M000032">signum (LongDecimalQuot)</a><br />
137
- <a href="classes/LongDecimalQuot.html#M000013">sint_digits10 (LongDecimalQuot)</a><br />
138
+ <a href="classes/LongDecimal.html#M000097">signum (LongDecimal)</a><br />
138
139
  <a href="classes/LongDecimal.html#M000056">sint_digits10 (LongDecimal)</a><br />
139
- <a href="classes/LongDecimal.html#M000084">size (LongDecimal)</a><br />
140
- <a href="classes/LongMath.html#M000123">split_to_words (LongMath)</a><br />
141
- <a href="classes/LongDecimal.html#M000090">sqrt (LongDecimal)</a><br />
142
- <a href="classes/LongMath.html#M000139">sqrt (LongMath)</a><br />
143
- <a href="classes/LongDecimal.html#M000091">sqrt_with_remainder (LongDecimal)</a><br />
144
- <a href="classes/LongMath.html#M000140">sqrt_with_remainder (LongMath)</a><br />
145
- <a href="classes/LongMath.html#M000125">sqrtb (LongMath)</a><br />
146
- <a href="classes/LongMath.html#M000126">sqrtb_with_remainder (LongMath)</a><br />
147
- <a href="classes/LongMath.html#M000127">sqrtw (LongMath)</a><br />
148
- <a href="classes/LongMath.html#M000128">sqrtw_with_remainder (LongMath)</a><br />
149
- <a href="classes/LongDecimalBase.html#M000111">square (LongDecimalBase)</a><br />
150
- <a href="classes/LongDecimal.html#M000089">square (LongDecimal)</a><br />
140
+ <a href="classes/LongDecimalQuot.html#M000013">sint_digits10 (LongDecimalQuot)</a><br />
141
+ <a href="classes/LongDecimal.html#M000085">size (LongDecimal)</a><br />
142
+ <a href="classes/LongMath.html#M000124">split_to_words (LongMath)</a><br />
143
+ <a href="classes/LongDecimal.html#M000091">sqrt (LongDecimal)</a><br />
144
+ <a href="classes/LongMath.html#M000140">sqrt (LongMath)</a><br />
145
+ <a href="classes/LongDecimal.html#M000092">sqrt_with_remainder (LongDecimal)</a><br />
146
+ <a href="classes/LongMath.html#M000141">sqrt_with_remainder (LongMath)</a><br />
147
+ <a href="classes/LongMath.html#M000126">sqrtb (LongMath)</a><br />
148
+ <a href="classes/LongMath.html#M000127">sqrtb_with_remainder (LongMath)</a><br />
149
+ <a href="classes/LongMath.html#M000128">sqrtw (LongMath)</a><br />
150
+ <a href="classes/LongMath.html#M000129">sqrtw_with_remainder (LongMath)</a><br />
151
+ <a href="classes/LongDecimal.html#M000090">square (LongDecimal)</a><br />
152
+ <a href="classes/LongDecimalBase.html#M000112">square (LongDecimalBase)</a><br />
153
+ <a href="classes/LongMath.html#M000153">standard_imode (LongMath)</a><br />
154
+ <a href="classes/LongMath.html#M000154">standard_imode= (LongMath)</a><br />
155
+ <a href="classes/LongMath.html#M000151">standard_mode (LongMath)</a><br />
156
+ <a href="classes/LongMath.html#M000152">standard_mode= (LongMath)</a><br />
151
157
  <a href="classes/LongDecimal.html#M000060">succ (LongDecimal)</a><br />
158
+ <a href="classes/LongDecimal.html#M000066">sunit (LongDecimal)</a><br />
152
159
  <a href="classes/LongDecimal.html#M000040">ten! (LongDecimal)</a><br />
153
160
  <a href="classes/LongDecimalQuot.html#M000010">to_bd (LongDecimalQuot)</a><br />
154
161
  <a href="classes/LongDecimal.html#M000053">to_bd (LongDecimal)</a><br />
155
- <a href="classes/LongDecimal.html#M000050">to_f (LongDecimal)</a><br />
156
162
  <a href="classes/LongDecimalQuot.html#M000009">to_f (LongDecimalQuot)</a><br />
157
- <a href="classes/LongDecimalQuot.html#M000011">to_i (LongDecimalQuot)</a><br />
163
+ <a href="classes/LongDecimal.html#M000050">to_f (LongDecimal)</a><br />
158
164
  <a href="classes/LongDecimal.html#M000051">to_i (LongDecimal)</a><br />
159
- <a href="classes/Rational.html#M000106">to_ld (Rational)</a><br />
160
- <a href="classes/Numeric.html#M000104">to_ld (Numeric)</a><br />
165
+ <a href="classes/LongDecimalQuot.html#M000011">to_i (LongDecimalQuot)</a><br />
161
166
  <a href="classes/LongDecimal.html#M000052">to_ld (LongDecimal)</a><br />
167
+ <a href="classes/Numeric.html#M000105">to_ld (Numeric)</a><br />
168
+ <a href="classes/Rational.html#M000107">to_ld (Rational)</a><br />
162
169
  <a href="classes/LongDecimalQuot.html#M000012">to_ld (LongDecimalQuot)</a><br />
163
- <a href="classes/LongDecimalBase.html#M000107">to_r (LongDecimalBase)</a><br />
164
- <a href="classes/LongDecimal.html#M000047">to_s (LongDecimal)</a><br />
170
+ <a href="classes/LongDecimalBase.html#M000108">to_r (LongDecimalBase)</a><br />
165
171
  <a href="classes/LongDecimalQuot.html#M000008">to_s (LongDecimalQuot)</a><br />
172
+ <a href="classes/LongDecimal.html#M000047">to_s (LongDecimal)</a><br />
166
173
  <a href="classes/LongDecimal.html#M000048">to_s_10 (LongDecimal)</a><br />
167
174
  <a href="classes/LongDecimal.html#M000049">to_s_internal (LongDecimal)</a><br />
168
175
  <a href="classes/LongDecimal.html#M000039">two! (LongDecimal)</a><br />
169
176
  <a href="classes/LongDecimal.html#M000065">unit (LongDecimal)</a><br />
170
177
  <a href="classes/LongDecimal.html#M000037">zero! (LongDecimal)</a><br />
171
- <a href="classes/LongDecimal.html#M000100">zero? (LongDecimal)</a><br />
178
+ <a href="classes/LongDecimal.html#M000101">zero? (LongDecimal)</a><br />
172
179
  <a href="classes/LongDecimalQuot.html#M000028">zero? (LongDecimalQuot)</a><br />
173
- <a href="classes/LongDecimal.html#M000078">| (LongDecimal)</a><br />
174
- <a href="classes/LongDecimal.html#M000080">~ (LongDecimal)</a><br />
180
+ <a href="classes/LongDecimal.html#M000079">| (LongDecimal)</a><br />
181
+ <a href="classes/LongDecimal.html#M000081">~ (LongDecimal)</a><br />
175
182
  </div>
176
183
  </div>
177
184
  </body>
@@ -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.33 2006/04/11 19:03:22 bk1 Exp $
5
- # CVS-Label: $Name: ALPHA_01_00 $
4
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.43 2006/05/01 12:22:12 bk1 Exp $
5
+ # CVS-Label: $Name: ALPHA_01_01 $
6
6
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
7
  #
8
8
  require "complex"
@@ -37,8 +37,18 @@ module LongDecimalRoundingMode
37
37
  end
38
38
  end
39
39
 
40
- def inverse
41
- LongDecimalRoundingMode::INVERSE_MODE[self]
40
+ #
41
+ # inverse mode in terms of multiplication
42
+ #
43
+ def minverse
44
+ LongDecimalRoundingMode::MUL_INVERSE_MODE[self]
45
+ end
46
+
47
+ #
48
+ # inverse mode in terms of addition
49
+ #
50
+ def ainverse
51
+ LongDecimalRoundingMode::ADD_INVERSE_MODE[self]
42
52
  end
43
53
 
44
54
  def hash
@@ -61,7 +71,7 @@ module LongDecimalRoundingMode
61
71
  ROUND_HALF_EVEN = RoundingModeClass.new(:ROUND_HALF_EVEN, 8)
62
72
  ROUND_UNNECESSARY = RoundingModeClass.new(:ROUND_UNNECESSARY, 9)
63
73
 
64
- INVERSE_MODE = {
74
+ MUL_INVERSE_MODE = {
65
75
  ROUND_UP => ROUND_DOWN,
66
76
  ROUND_DOWN => ROUND_UP,
67
77
  ROUND_CEILING => ROUND_FLOOR,
@@ -74,13 +84,26 @@ module LongDecimalRoundingMode
74
84
  ROUND_UNNECESSARY => ROUND_UNNECESSARY
75
85
  }
76
86
 
87
+ ADD_INVERSE_MODE = {
88
+ ROUND_UP => ROUND_UP,
89
+ ROUND_DOWN => ROUND_DOWN,
90
+ ROUND_CEILING => ROUND_FLOOR,
91
+ ROUND_FLOOR => ROUND_CEILING,
92
+ ROUND_HALF_UP => ROUND_HALF_UP,
93
+ ROUND_HALF_DOWN => ROUND_HALF_DOWN,
94
+ ROUND_HALF_CEILING => ROUND_HALF_FLOOR,
95
+ ROUND_HALF_FLOOR => ROUND_HALF_CEILING,
96
+ ROUND_HALF_EVEN => ROUND_HALF_EVEN,
97
+ ROUND_UNNECESSARY => ROUND_UNNECESSARY
98
+ }
99
+
77
100
  end # LongDecimalRoundingMode
78
101
 
79
102
  #
80
103
  # common base class for LongDecimal and LongDecimalQuot
81
104
  #
82
105
  class LongDecimalBase < Numeric
83
- @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
106
+ @RCS_ID='-$Id: long-decimal.rb,v 1.43 2006/05/01 12:22:12 bk1 Exp $-'
84
107
 
85
108
  include LongDecimalRoundingMode
86
109
 
@@ -188,7 +211,7 @@ end # class LongDecimalBase
188
211
  # digits and the other one the position of the decimal point.
189
212
  #
190
213
  class LongDecimal < LongDecimalBase
191
- @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
214
+ @RCS_ID='-$Id: long-decimal.rb,v 1.43 2006/05/01 12:22:12 bk1 Exp $-'
192
215
 
193
216
  # MINUS_ONE = LongDecimal(-1)
194
217
  # ZERO = LongDecimal(0)
@@ -525,12 +548,25 @@ class LongDecimal < LongDecimalBase
525
548
  # representation otherwise.
526
549
  #
527
550
  def to_f
551
+ # handle overflow: raise exception
552
+ if (self.abs > LongMath::MAX_FLOATABLE) then
553
+ raise ArgumentError, "self=#{self.inspect} cannot be expressed as Float"
554
+ end
555
+
556
+ # handle underflow: return 0.0
557
+ if (self.abs < LongMath::MIN_FLOATABLE) then
558
+ return 0.0
559
+ end
560
+
528
561
  divisor = denominator
529
562
  if (divisor == 1) then
530
563
  return numerator.to_f
531
564
  elsif numerator.abs <= LongMath::MAX_FLOATABLE then
532
565
  if (divisor.abs > LongMath::MAX_FLOATABLE) then
533
- return 0.0
566
+ q = 10**(scale - Float::MAX_10_EXP)
567
+ f = (numerator / q).to_f
568
+ d = divisor / q
569
+ return f / d
534
570
  else
535
571
  f = numerator.to_f
536
572
  return f / divisor
@@ -567,7 +603,7 @@ class LongDecimal < LongDecimalBase
567
603
  # optional first argument gives the precision for the desired result
568
604
  # optional second argument gives the rouding mode
569
605
  #
570
- def to_ld(prec = nil, mode = LongDecimal::ROUND_HALF_UP)
606
+ def to_ld(prec = nil, mode = LongMath.standard_mode)
571
607
  if (prec.nil?)
572
608
  return self
573
609
  else
@@ -747,6 +783,13 @@ class LongDecimal < LongDecimalBase
747
783
  LongDecimal(1, scale)
748
784
  end
749
785
 
786
+ #
787
+ # return the unit by which self is incremented by succ times sign
788
+ #
789
+ def sunit
790
+ LongDecimal(sign, scale)
791
+ end
792
+
750
793
  #
751
794
  # apply unary -
752
795
  # (returns negated self)
@@ -894,6 +937,7 @@ class LongDecimal < LongDecimalBase
894
937
  else
895
938
  abs_other = -other
896
939
  new_scale = abs_other * scale
940
+ # puts("other=#{other} abs_other=#{abs_other} int_val=#{int_val} new_scale=#{new_scale} scale=#{scale}")
897
941
  LongDecimalQuot(Rational(10 ** new_scale, int_val ** abs_other), new_scale)
898
942
  end
899
943
  else
@@ -1225,7 +1269,7 @@ end # LongDecimal
1225
1269
  #
1226
1270
  class LongDecimalQuot < LongDecimalBase
1227
1271
 
1228
- @RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
1272
+ @RCS_ID='-$Id: long-decimal.rb,v 1.43 2006/05/01 12:22:12 bk1 Exp $-'
1229
1273
 
1230
1274
  #
1231
1275
  # constructor
@@ -1339,7 +1383,7 @@ class LongDecimalQuot < LongDecimalBase
1339
1383
  # optional first argument gives the precision for the desired result
1340
1384
  # optional second argument gives the rouding mode
1341
1385
  #
1342
- def to_ld(prec = scale, mode = LongDecimal::ROUND_HALF_UP)
1386
+ def to_ld(prec = scale, mode = LongMath.standard_mode)
1343
1387
  round_to_scale(prec, mode)
1344
1388
  end
1345
1389
 
@@ -1782,7 +1826,7 @@ class Numeric
1782
1826
  # optional first argument gives the precision for the desired result
1783
1827
  # optional second argument gives the rouding mode
1784
1828
  #
1785
- def to_ld(prec = nil, mode = LongDecimal::ROUND_HALF_UP)
1829
+ def to_ld(prec = nil, mode = LongMath.standard_mode)
1786
1830
  l = LongDecimal(self)
1787
1831
  if (prec.nil?)
1788
1832
  return l
@@ -1809,7 +1853,7 @@ class Rational
1809
1853
  # optional first argument gives the precision for the desired result
1810
1854
  # optional second argument gives the rouding mode
1811
1855
  #
1812
- def to_ld(prec = nil, mode = LongDecimal::ROUND_HALF_UP)
1856
+ def to_ld(prec = nil, mode = LongMath.standard_mode)
1813
1857
  if (prec.nil?)
1814
1858
  return LongDecimal(self)
1815
1859
  else
@@ -1831,10 +1875,11 @@ module LongMath
1831
1875
 
1832
1876
  include LongDecimalRoundingMode
1833
1877
 
1834
- MAX_FLOATABLE = Float::MAX.to_i
1835
- MAX_EXP_ABLE = Math.log(MAX_FLOATABLE).to_i
1836
- LOG2 = Math.log(2.0)
1837
- LOG10 = Math.log(10.0)
1878
+ MAX_FLOATABLE = Float::MAX.to_i
1879
+ MAX_EXP_ABLE = Math.log(MAX_FLOATABLE).to_i
1880
+ MIN_FLOATABLE = Float::MIN.to_ld(340, LongMath::ROUND_UP)
1881
+ LOG2 = Math.log(2.0)
1882
+ LOG10 = Math.log(10.0)
1838
1883
 
1839
1884
  @@cache = {}
1840
1885
 
@@ -2281,11 +2326,11 @@ module LongMath
2281
2326
  # cache_result should the result be cached? Set to false, if an
2282
2327
  # extraordinary long result is really needed only once
2283
2328
  #
2284
- def LongMath.pi(prec, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = nil, cache_result = true)
2329
+ def LongMath.pi(prec, final_mode = LongMath.standard_mode, iprec = nil, mode = nil, cache_result = true) # DOWN?
2285
2330
 
2286
2331
  check_is_prec(prec, "prec")
2287
2332
  if (mode.nil?)
2288
- mode = LongDecimal::ROUND_HALF_DOWN
2333
+ mode = LongMath.standard_mode
2289
2334
  end
2290
2335
  check_is_mode(final_mode, "final_mode")
2291
2336
  check_is_mode(mode, "mode")
@@ -2340,7 +2385,7 @@ module LongMath
2340
2385
  # with the exponential function that exceed the memory. It may be
2341
2386
  # removed in future versions.
2342
2387
  #
2343
- def LongMath.exp(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2388
+ def LongMath.exp(x, prec, mode = LongMath.standard_mode) # down?
2344
2389
  raise TypeError, "x=#{x.inspect} must not be greater #{MAX_EXP_ABLE}" unless x <= MAX_EXP_ABLE
2345
2390
  check_is_prec(prec, "prec")
2346
2391
  check_is_mode(mode, "mode")
@@ -2354,7 +2399,7 @@ module LongMath
2354
2399
  # arbitrary, but it is enforced in order to avoid producing numbers
2355
2400
  # with the exponential function that exceed the memory.
2356
2401
  #
2357
- def LongMath.exp2(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2402
+ def LongMath.exp2(x, prec, mode = LongMath.standard_mode) # down?
2358
2403
  LongMath.power(2, x, prec, mode)
2359
2404
  end
2360
2405
 
@@ -2365,7 +2410,7 @@ module LongMath
2365
2410
  # arbitrary, but it is enforced in order to avoid producing numbers
2366
2411
  # with the exponential function that exceed the memory.
2367
2412
  #
2368
- def LongMath.exp10(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2413
+ def LongMath.exp10(x, prec, mode = LongMath.standard_mode) # down?
2369
2414
  LongMath.power(10, x, prec, mode)
2370
2415
  end
2371
2416
 
@@ -2405,7 +2450,7 @@ module LongMath
2405
2450
  # create a bug report, if the default settings for the parameters do
2406
2451
  # not work correctly
2407
2452
  #
2408
- def LongMath.exp_internal(x, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, j = nil, k = nil, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN, cache_result = true)
2453
+ def LongMath.exp_internal(x, prec = nil, final_mode = LongMath.standard_mode, j = nil, k = nil, iprec = nil, mode = LongMath.standard_imode, cache_result = true) # down?
2409
2454
 
2410
2455
  if (prec == nil) then
2411
2456
  if (x.kind_of? LongDecimalBase)
@@ -2417,7 +2462,7 @@ module LongMath
2417
2462
  check_is_prec(prec, "prec")
2418
2463
 
2419
2464
  if (final_mode == nil)
2420
- final_mode = LongDecimal::ROUND_HALF_DOWN
2465
+ final_mode = LongMath.standard_mode
2421
2466
  end
2422
2467
  check_is_mode(final_mode, "final_mode")
2423
2468
  check_is_mode(mode, "mode")
@@ -2528,7 +2573,7 @@ module LongMath
2528
2573
  #
2529
2574
  # calculate approximation of sqrt of a LongDecimal.
2530
2575
  #
2531
- def LongMath.sqrt(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2576
+ def LongMath.sqrt(x, prec, mode = LongMath.standard_mode) # down
2532
2577
  LongMath.sqrt_internal(x, prec, mode, false)
2533
2578
  end
2534
2579
 
@@ -2596,7 +2641,7 @@ module LongMath
2596
2641
  # calculate the natural logarithm function of x to the given precision as
2597
2642
  # LongDecimal.
2598
2643
  #
2599
- def LongMath.log(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2644
+ def LongMath.log(x, prec, mode = LongMath.standard_mode) # down?
2600
2645
  check_is_prec(prec, "prec")
2601
2646
  check_is_mode(mode, "mode")
2602
2647
  log_internal(x, prec, mode)
@@ -2606,11 +2651,11 @@ module LongMath
2606
2651
  # calculate the base 10 logarithm of x to the given precision as
2607
2652
  # LongDecimal.
2608
2653
  #
2609
- def LongMath.log10(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2654
+ def LongMath.log10(x, prec, mode = LongMath.standard_mode) # down?
2610
2655
 
2611
2656
  check_is_prec(prec, "prec")
2612
2657
  check_is_mode(mode, "mode")
2613
- iprec = prec + 5
2658
+ iprec = prec + 6
2614
2659
  unless (x.kind_of? LongDecimal)
2615
2660
  x = x.to_ld(iprec, mode)
2616
2661
  end
@@ -2630,7 +2675,7 @@ module LongMath
2630
2675
  # calculate the base 2 logarithm of x to the given precision as
2631
2676
  # LongDecimal.
2632
2677
  #
2633
- def LongMath.log2(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2678
+ def LongMath.log2(x, prec, mode = LongMath.standard_mode)
2634
2679
 
2635
2680
  check_is_prec(prec, "prec")
2636
2681
  check_is_mode(mode, "mode")
@@ -2656,7 +2701,7 @@ module LongMath
2656
2701
  # create a bug report, if the default settings for the parameters do
2657
2702
  # not work correctly
2658
2703
  #
2659
- def LongMath.log_internal(x, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN, cache_result = true)
2704
+ def LongMath.log_internal(x, prec = nil, final_mode = LongMath.standard_mode, iprec = nil, mode = LongMath.standard_imode, cache_result = true)
2660
2705
 
2661
2706
  raise TypeError, "x=#{x.inspect} must not be positive" unless x > 0
2662
2707
  if (prec == nil) then
@@ -2669,7 +2714,7 @@ module LongMath
2669
2714
  check_is_prec(prec, "prec")
2670
2715
 
2671
2716
  if (final_mode == nil)
2672
- final_mode = LongDecimal::ROUND_HALF_DOWN
2717
+ final_mode = LongMath.standard_mode
2673
2718
  end
2674
2719
  check_is_mode(final_mode, "final_mode")
2675
2720
  check_is_mode(mode, "mode")
@@ -2707,8 +2752,7 @@ module LongMath
2707
2752
  #
2708
2753
  def LongMath.log_raw(x, prec, iprec, mode)
2709
2754
 
2710
- # t0 = Time.new
2711
- # puts("log_raw start")
2755
+ # puts("log_raw start x=#{x}")
2712
2756
 
2713
2757
  # we have to rely on iprec being at least 10
2714
2758
  raise TypeError, "iprec=#{iprec} out of range" unless (iprec.kind_of? Fixnum) && iprec >= 10
@@ -2722,11 +2766,13 @@ module LongMath
2722
2766
  # sign of result
2723
2767
  s = 1
2724
2768
  # make sure x is >= 1
2769
+ mode1 = mode
2725
2770
  if (x < 1) then
2726
- x = (1 / x).round_to_scale(iprec, mode)
2771
+ mode1 = mode1.minverse
2772
+ x = (1 / x).round_to_scale(iprec, mode1)
2727
2773
  s = -1
2728
2774
  end
2729
- # puts("log_raw prepared t=#{Time.new-t0}")
2775
+ # puts("log_raw prepared t=#{Time.new-t0} x=#{x} s=#{s} mode=#{mode} mode1=#{mode1}")
2730
2776
 
2731
2777
  # number that are beyond the usual range of Float need to be
2732
2778
  # handled specially to reduce to something expressable as Float
@@ -2734,7 +2780,7 @@ module LongMath
2734
2780
  exp_keys.each do |exp_key|
2735
2781
  exp_val = exp(exp_key, iprec)
2736
2782
  while (x > exp_val) do
2737
- x = (x / exp_val).round_to_scale(iprec, mode)
2783
+ x = (x / exp_val).round_to_scale(iprec, mode1)
2738
2784
  if (s < 0) then
2739
2785
  y -= exp_key
2740
2786
  else
@@ -2742,6 +2788,7 @@ module LongMath
2742
2788
  end
2743
2789
  end
2744
2790
  end
2791
+ # puts("log_raw divided t=#{Time.new-t0} x=#{x} y=#{y} s=#{s}")
2745
2792
 
2746
2793
  factor = 1
2747
2794
  sprec = (iprec * 1.5).round
@@ -2751,9 +2798,20 @@ module LongMath
2751
2798
  # delta = LongDecimal(1, LongMath.sqrtw(iprec))
2752
2799
  # delta = LongDecimal(1, LongMath.sqrtw(LongMath.sqrtw(iprec+1)+1))
2753
2800
  while (x - 1).abs > delta do
2754
- x = LongMath.sqrt(x, sprec, mode)
2801
+ x = LongMath.sqrt(x, sprec, mode1)
2755
2802
  factor *= 2
2756
2803
  end
2804
+ # puts("log_raw rooted t=#{Time.new-t0} x=#{x} y=#{y} s=#{s} f=#{factor}")
2805
+
2806
+ ss = 1
2807
+ mode2 = mode1.ainverse
2808
+ if (x < 1)
2809
+ puts("x<1 inverting")
2810
+ mode2 = mode2.ainverse
2811
+ x = (1 / x).round_to_scale(iprec, mode2)
2812
+ ss = -1
2813
+ end
2814
+ # puts("log_raw 2nd prep t=#{Time.new-t0} x=#{x} y=#{y} s=#{s} ss=#{ss} f=#{factor}")
2757
2815
 
2758
2816
  sum = 0
2759
2817
  z = 1 - x
@@ -2761,14 +2819,17 @@ module LongMath
2761
2819
  p = 1.to_ld
2762
2820
  d = 1.to_ld
2763
2821
  until p.abs.round_to_scale(dprec, LongDecimal::ROUND_DOWN).zero? do
2764
- p = (p * z).round_to_scale(iprec, mode)
2765
- d = (p / i).round_to_scale(iprec, mode)
2822
+ p = (p * z).round_to_scale(iprec, mode2)
2823
+ d = (p / i).round_to_scale(iprec, mode2)
2766
2824
  i += 1
2767
2825
  sum += d
2768
2826
 
2769
2827
  end
2828
+ sum *= ss
2829
+ # puts("log_raw added t=#{Time.new-t0} x=#{x} y=#{y} sum=#{sum} s=#{s} ss=#{ss} f=#{factor}")
2770
2830
 
2771
- y -= ((s * factor) * sum).round_to_scale(iprec, mode)
2831
+ y -= ((s * factor) * sum).round_to_scale(iprec, mode.ainverse)
2832
+ # puts("log_raw done t=#{Time.new-t0} x=#{x} y=#{y} sum=#{sum} s=#{s} ss=#{ss} f=#{factor}")
2772
2833
  return y
2773
2834
  end
2774
2835
 
@@ -2780,10 +2841,14 @@ module LongMath
2780
2841
  def LongMath.calc_iprec_for_power(x, y, prec)
2781
2842
  x_f = x.to_f
2782
2843
  y_f = y.to_f
2844
+ # if (x_f - 1).abs < 0.1
2845
+ # # x_f += 1e-6
2846
+ # x_f = x.square.to_f + 1e-4
2847
+ # end
2783
2848
  logx_f = Math.log(x_f.abs)
2784
2849
  logy_f = Math.log(y_f.abs)
2785
2850
  logx_y_f = logx_f * y_f
2786
- iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0)
2851
+ iprec_x = calc_iprec_for_exp(logx_y_f.abs.ceil, prec, logx_y_f < 0)
2787
2852
  # iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0) + 10
2788
2853
  iprec_y = iprec_x
2789
2854
  iprec = iprec_x + 2
@@ -2793,6 +2858,7 @@ module LongMath
2793
2858
  if (logy_f < 0)
2794
2859
  iprec_y -= (logy_f/LOG10).round
2795
2860
  end
2861
+ # puts("\niprec: x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y}\n")
2796
2862
  [ iprec, iprec_x, iprec_y ]
2797
2863
 
2798
2864
  end
@@ -2804,12 +2870,13 @@ module LongMath
2804
2870
  # LongDecimal. Only supports values of y such that exp(y) still
2805
2871
  # fits into a float (y <= 709)
2806
2872
  #
2807
- def LongMath.power(x, y, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2873
+ def LongMath.power(x, y, prec, mode = LongMath.standard_mode)
2808
2874
 
2809
2875
  raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
2810
2876
  raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
2877
+ raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
2878
+ raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
2811
2879
  # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
2812
- # raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x <= MAX_FLOATABLE
2813
2880
  # raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?
2814
2881
  raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
2815
2882
  check_is_prec(prec, "prec")
@@ -2827,6 +2894,7 @@ module LongMath
2827
2894
  end
2828
2895
 
2829
2896
  iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
2897
+ # puts("x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y} prec=#{prec}")
2830
2898
 
2831
2899
  unless (x.kind_of? LongDecimalBase) || (x.kind_of? Integer)
2832
2900
  x = x.to_ld(iprec_x, mode)
@@ -2844,7 +2912,9 @@ module LongMath
2844
2912
  # x = x.to_ld(prec)
2845
2913
  x = x.to_ld(iprec_x)
2846
2914
  end
2847
- z = x**y
2915
+ # z = x ** y
2916
+ z = LongMath.ipower(x, y, 2*iprec, mode)
2917
+ # puts("x=#{x} y=#{y} z=#{z} y int")
2848
2918
  return z.to_ld(prec, mode)
2849
2919
  end
2850
2920
 
@@ -2855,21 +2925,86 @@ module LongMath
2855
2925
  y = y.to_ld(iprec_y, mode)
2856
2926
  end
2857
2927
 
2928
+ if x < 1 then
2929
+ # since we do not allow x < 0 and we have handled x = 0 already,
2930
+ # we can be sure that x is no integer, so it has been converted
2931
+ # if necessary to LongDecimalBase
2932
+ y = -y
2933
+ x = (1/x).round_to_scale(iprec_x*2, mode)
2934
+ iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
2935
+ end
2936
+
2858
2937
  # exponent is split in two parts, an integer part and a
2859
2938
  # LongDecimal with absolute value <= 0.5
2860
- y0 = y.round_to_scale(0, LongDecimal::ROUND_HALF_UP).to_i
2861
- z0 = x**y0
2939
+ y0 = y.round_to_scale(0, LongMath.standard_imode).to_i
2940
+ # z0 = x**y0
2941
+ z0 = LongMath.ipower(x, y0, 2*iprec, mode)
2862
2942
  y1 = y - y0
2863
2943
  prec_extra = 0
2864
2944
  if (y0 > 0)
2865
2945
  prec_extra = (y0*Math.log10(x.to_f).abs).ceil
2866
2946
  end
2867
2947
  # z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
2868
- z1 = LongMath.power_internal(x, y1, prec+prec_extra + 3, mode)
2948
+ z1 = LongMath.power_internal(x, y1, prec+prec_extra + 4, mode)
2869
2949
  z = z0 * z1
2950
+ # puts("x=#{x} y=#{y} z=#{z} y not int")
2870
2951
  return z.to_ld(prec, mode)
2871
2952
  end
2872
2953
 
2954
+ #
2955
+ # internal functionality to calculate the y-th power of x assuming
2956
+ # that y is an integer
2957
+ # prec is a hint on how much internal precision is needed at most
2958
+ # final rounding is left to the caller
2959
+ #
2960
+ def LongMath.ipower(x, y, prec, mode)
2961
+
2962
+ raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
2963
+ raise TypeError, "y=#{y} must be integer" unless y.kind_of? Integer
2964
+ raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
2965
+ raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
2966
+ check_is_prec(prec, "prec")
2967
+ check_is_mode(mode, "mode")
2968
+
2969
+ if (y.zero?)
2970
+ return 1
2971
+ elsif ! (x.kind_of? LongDecimalBase) || x.scale * y.abs <= prec
2972
+ return x ** y
2973
+ elsif (y < 0)
2974
+ l = Math.log10(x.abs.to_f)
2975
+ if (l > 0)
2976
+ prec += (2*l).ceil
2977
+ end
2978
+ return 1/LongMath.ipower(x, -y, prec, mode)
2979
+ else
2980
+ # y > 0
2981
+ # puts("ipower y>0 x=#{x} y=#{y} prec=#{prec}")
2982
+ z = x
2983
+ while true do
2984
+
2985
+ y -= 1
2986
+ if (y.zero?)
2987
+ break
2988
+ end
2989
+ while (y & 0x01) == 0 do
2990
+
2991
+ y = y >> 1
2992
+ x = (x*x)
2993
+ if (x.kind_of? LongDecimalBase)
2994
+ x = x.round_to_scale(prec, mode)
2995
+ end
2996
+
2997
+ end
2998
+ z = (z*x)
2999
+ if (z.kind_of? LongDecimalBase)
3000
+ z = z.round_to_scale(prec, mode)
3001
+ end
3002
+
3003
+ end
3004
+ end
3005
+ return z
3006
+ end
3007
+
2873
3008
  #
2874
3009
  # internal functionality of exp. exposes some more parameters, that
2875
3010
  # should usually be set to defaut values, in order to allow better testing.
@@ -2877,7 +3012,7 @@ module LongMath
2877
3012
  # create a bug report, if the default settings for the parameters do
2878
3013
  # not work correctly
2879
3014
  #
2880
- def LongMath.power_internal(x, y, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN)
3015
+ def LongMath.power_internal(x, y, prec = nil, final_mode = LongMath.standard_mode, iprec = nil, mode = LongMath.standard_imode)
2881
3016
 
2882
3017
  if (prec == nil) then
2883
3018
  if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
@@ -2893,7 +3028,7 @@ module LongMath
2893
3028
  check_is_prec(prec, "prec")
2894
3029
 
2895
3030
  if (final_mode == nil)
2896
- final_mode = LongDecimal::ROUND_HALF_DOWN
3031
+ final_mode = LongMath.standard_mode
2897
3032
  end
2898
3033
  check_is_mode(final_mode, "final_mode")
2899
3034
  check_is_mode(mode, "mode")
@@ -2926,6 +3061,28 @@ module LongMath
2926
3061
 
2927
3062
  end # power_internal
2928
3063
 
3064
+ @@standard_mode = ROUND_HALF_UP
3065
+
3066
+ def LongMath.standard_mode
3067
+ @@standard_mode
3068
+ end
3069
+
3070
+ def LongMath.standard_mode=(x)
3071
+ LongMath.check_is_mode
3072
+ @@standard_mode = x
3073
+ end
3074
+
3075
+ @@standard_imode = ROUND_HALF_EVEN
3076
+
3077
+ def LongMath.standard_imode
3078
+ @@standard_imode
3079
+ end
3080
+
3081
+ def LongMath.standard_imode=(x)
3082
+ LongMath.check_is_mode
3083
+ @@standard_imode = x
3084
+ end
3085
+
2929
3086
  end # LongMath
2930
3087
 
2931
3088
  # end of file long-decimal.rb