long-decimal 0.00.19 → 0.00.20

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 (152) hide show
  1. data/README +25 -22
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/doc/classes/LongDecimal.html +327 -286
  5. data/doc/classes/LongDecimal.src/M000041.html +10 -4
  6. data/doc/classes/LongDecimal.src/M000042.html +3 -2
  7. data/doc/classes/LongDecimal.src/M000043.html +10 -26
  8. data/doc/classes/LongDecimal.src/M000044.html +24 -16
  9. data/doc/classes/LongDecimal.src/M000045.html +19 -4
  10. data/doc/classes/LongDecimal.src/M000046.html +4 -15
  11. data/doc/classes/LongDecimal.src/M000047.html +13 -26
  12. data/doc/classes/LongDecimal.src/M000048.html +28 -4
  13. data/doc/classes/LongDecimal.src/M000049.html +4 -8
  14. data/doc/classes/LongDecimal.src/M000050.html +8 -6
  15. data/doc/classes/LongDecimal.src/M000051.html +6 -4
  16. data/doc/classes/LongDecimal.src/M000052.html +4 -15
  17. data/doc/classes/LongDecimal.src/M000053.html +8 -24
  18. data/doc/classes/LongDecimal.src/M000054.html +6 -14
  19. data/doc/classes/LongDecimal.src/M000055.html +4 -13
  20. data/doc/classes/LongDecimal.src/M000056.html +15 -4
  21. data/doc/classes/LongDecimal.src/M000057.html +27 -0
  22. data/doc/classes/LongDecimal.src/M000058.html +4 -4
  23. data/doc/classes/LongDecimal.src/M000060.html +4 -4
  24. data/doc/classes/LongDecimal.src/M000061.html +5 -4
  25. data/doc/classes/LongDecimal.src/M000062.html +5 -8
  26. data/doc/classes/LongDecimal.src/M000063.html +4 -9
  27. data/doc/classes/LongDecimal.src/M000064.html +6 -7
  28. data/doc/classes/LongDecimal.src/M000065.html +6 -6
  29. data/doc/classes/LongDecimal.src/M000066.html +9 -4
  30. data/doc/classes/LongDecimal.src/M000067.html +7 -13
  31. data/doc/classes/LongDecimal.src/M000068.html +4 -9
  32. data/doc/classes/LongDecimal.src/M000069.html +13 -7
  33. data/doc/classes/LongDecimal.src/M000070.html +7 -18
  34. data/doc/classes/LongDecimal.src/M000071.html +8 -7
  35. data/doc/classes/LongDecimal.src/M000072.html +20 -5
  36. data/doc/classes/LongDecimal.src/M000073.html +6 -7
  37. data/doc/classes/LongDecimal.src/M000074.html +5 -9
  38. data/doc/classes/LongDecimal.src/M000075.html +5 -5
  39. data/doc/classes/LongDecimal.src/M000076.html +9 -4
  40. data/doc/classes/LongDecimal.src/M000077.html +7 -5
  41. data/doc/classes/LongDecimal.src/M000078.html +4 -7
  42. data/doc/classes/LongDecimal.src/M000079.html +7 -4
  43. data/doc/classes/LongDecimal.src/M000080.html +7 -4
  44. data/doc/classes/LongDecimal.src/M000081.html +4 -9
  45. data/doc/classes/LongDecimal.src/M000082.html +3 -8
  46. data/doc/classes/LongDecimal.src/M000083.html +9 -5
  47. data/doc/classes/LongDecimal.src/M000084.html +7 -7
  48. data/doc/classes/LongDecimal.src/M000085.html +5 -4
  49. data/doc/classes/LongDecimal.src/M000086.html +9 -4
  50. data/doc/classes/LongDecimal.src/M000087.html +4 -4
  51. data/doc/classes/LongDecimal.src/M000088.html +4 -4
  52. data/doc/classes/LongDecimal.src/M000089.html +4 -59
  53. data/doc/classes/LongDecimal.src/M000090.html +4 -4
  54. data/doc/classes/LongDecimal.src/M000091.html +59 -4
  55. data/doc/classes/LongDecimal.src/M000092.html +18 -0
  56. data/doc/classes/LongDecimal.src/M000093.html +18 -0
  57. data/doc/classes/LongDecimal.src/M000096.html +5 -4
  58. data/doc/classes/LongDecimal.src/M000097.html +5 -4
  59. data/doc/classes/LongDecimal.src/M000098.html +4 -4
  60. data/doc/classes/LongDecimal.src/M000099.html +4 -4
  61. data/doc/classes/LongDecimal.src/M000100.html +18 -0
  62. data/doc/classes/LongDecimal.src/M000101.html +18 -0
  63. data/doc/classes/LongDecimalBase.html +53 -53
  64. data/doc/classes/LongDecimalBase.src/M000104.html +4 -4
  65. data/doc/classes/LongDecimalBase.src/M000105.html +4 -4
  66. data/doc/classes/LongDecimalBase.src/M000106.html +4 -4
  67. data/doc/classes/LongDecimalBase.src/M000107.html +4 -4
  68. data/doc/classes/LongDecimalBase.src/M000108.html +18 -0
  69. data/doc/classes/LongDecimalBase.src/M000109.html +4 -9
  70. data/doc/classes/LongDecimalBase.src/M000112.html +9 -4
  71. data/doc/classes/LongDecimalBase.src/M000113.html +19 -0
  72. data/doc/classes/LongDecimalBase.src/M000114.html +18 -0
  73. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  74. data/doc/classes/LongDecimalQuot.src/M000004.html +22 -5
  75. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  76. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  77. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  78. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  79. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  80. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  81. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  82. data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
  83. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  84. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  85. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  86. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  87. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  88. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  89. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  90. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  91. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  92. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  93. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  94. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  95. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  96. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  97. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  98. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  99. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  100. data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
  101. data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
  102. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +10 -10
  103. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000141.html +22 -0
  104. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000142.html +18 -0
  105. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000146.html +22 -0
  106. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000147.html +18 -0
  107. data/doc/classes/LongMath.html +191 -137
  108. data/doc/classes/LongMath.src/M000115.html +5 -4
  109. data/doc/classes/LongMath.src/M000116.html +4 -5
  110. data/doc/classes/LongMath.src/M000117.html +4 -4
  111. data/doc/classes/LongMath.src/M000118.html +5 -18
  112. data/doc/classes/LongMath.src/M000119.html +4 -18
  113. data/doc/classes/LongMath.src/M000120.html +18 -5
  114. data/doc/classes/LongMath.src/M000121.html +16 -27
  115. data/doc/classes/LongMath.src/M000122.html +4 -4
  116. data/doc/classes/LongMath.src/M000123.html +17 -44
  117. data/doc/classes/LongMath.src/M000124.html +5 -21
  118. data/doc/classes/LongMath.src/M000125.html +49 -29
  119. data/doc/classes/LongMath.src/M000126.html +20 -47
  120. data/doc/classes/LongMath.src/M000127.html +36 -8
  121. data/doc/classes/LongMath.src/M000128.html +6 -4
  122. data/doc/classes/LongMath.src/M000129.html +33 -4
  123. data/doc/classes/LongMath.src/M000130.html +40 -56
  124. data/doc/classes/LongMath.src/M000131.html +8 -43
  125. data/doc/classes/LongMath.src/M000132.html +4 -10
  126. data/doc/classes/LongMath.src/M000133.html +4 -7
  127. data/doc/classes/LongMath.src/M000134.html +58 -15
  128. data/doc/classes/LongMath.src/M000135.html +39 -16
  129. data/doc/classes/LongMath.src/M000136.html +6 -39
  130. data/doc/classes/LongMath.src/M000137.html +5 -168
  131. data/doc/classes/LongMath.src/M000138.html +34 -0
  132. data/doc/classes/LongMath.src/M000139.html +34 -0
  133. data/doc/classes/LongMath.src/M000140.html +57 -0
  134. data/doc/classes/LongMath.src/M000141.html +219 -0
  135. data/doc/classes/LongMath.src/M000142.html +33 -0
  136. data/doc/classes/LongMath.src/M000143.html +70 -0
  137. data/doc/classes/LongMath.src/M000144.html +58 -0
  138. data/doc/classes/LongMath/CacheKey.html +164 -0
  139. data/doc/classes/LongMath/CacheKey.src/M000140.html +36 -0
  140. data/doc/classes/LongMath/CacheKey.src/M000145.html +36 -0
  141. data/doc/classes/Numeric.html +5 -5
  142. data/doc/classes/Numeric.src/M000102.html +23 -0
  143. data/doc/classes/Rational.html +5 -5
  144. data/doc/classes/Rational.src/M000103.html +23 -0
  145. data/doc/created.rid +1 -1
  146. data/doc/files/lib/long-decimal_rb.html +2 -2
  147. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  148. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  149. data/doc/fr_method_index.html +106 -101
  150. data/lib/long-decimal.rb +203 -85
  151. data/test/testlongdecimal.rb +372 -69
  152. metadata +28 -2
@@ -101,7 +101,7 @@
101
101
  <h3 class="section-bar">Methods</h3>
102
102
 
103
103
  <div class="name-list">
104
- <a href="#M000101">to_ld</a>&nbsp;&nbsp;
104
+ <a href="#M000103">to_ld</a>&nbsp;&nbsp;
105
105
  </div>
106
106
  </div>
107
107
 
@@ -123,12 +123,12 @@
123
123
  <div id="methods">
124
124
  <h3 class="section-bar">Public Instance methods</h3>
125
125
 
126
- <div id="method-M000101" class="method-detail">
127
- <a name="M000101"></a>
126
+ <div id="method-M000103" class="method-detail">
127
+ <a name="M000103"></a>
128
128
 
129
129
  <div class="method-heading">
130
- <a href="Rational.src/M000101.html" target="Code" class="method-signature"
131
- onclick="popupCode('Rational.src/M000101.html');return false;">
130
+ <a href="Rational.src/M000103.html" target="Code" class="method-signature"
131
+ onclick="popupCode('Rational.src/M000103.html');return false;">
132
132
  <span class="method-name">to_ld</span><span class="method-args">(prec = nil, mode = LongDecimal::ROUND_HALF_UP)</span>
133
133
  </a>
134
134
  </div>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html>
7
+ <head>
8
+ <title>to_ld (Rational)</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
11
+ </head>
12
+ <body class="standalone-code">
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1755</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_UP</span>)
15
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">prec</span>.<span class="ruby-identifier">nil?</span>)
16
+ <span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>(<span class="ruby-keyword kw">self</span>)
17
+ <span class="ruby-keyword kw">else</span>
18
+ <span class="ruby-identifier">l</span> = <span class="ruby-constant">LongDecimalQuot</span>(<span class="ruby-keyword kw">self</span>, <span class="ruby-identifier">prec</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>
21
+ <span class="ruby-keyword kw">end</span></pre>
22
+ </body>
23
+ </html>
data/doc/created.rid CHANGED
@@ -1 +1 @@
1
- Sat Apr 01 11:11:32 CEST 2006
1
+ Sun Apr 02 18:14:18 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>Sat Apr 01 11:11:28 CEST 2006</td>
59
+ <td>Sun Apr 02 18:12:26 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.19 2006/04/01 08:52:06 bk1 Exp $ CVS-Label: $Name: PRE_ALPHA_0_19 $
93
+ 1.20 2006/04/02 15:52:27 bk1 Exp $ CVS-Label: $Name: PRE_ALPHA_0_20 $
94
94
  Author: $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 1673</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1710</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 1686</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1723</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,148 +20,153 @@
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#M000072">% (LongDecimal)</a><br />
23
+ <a href="classes/LongDecimal.html#M000074">% (LongDecimal)</a><br />
24
24
  <a href="classes/LongDecimalQuot.html#M000021">% (LongDecimalQuot)</a><br />
25
- <a href="classes/LongDecimal.html#M000073">& (LongDecimal)</a><br />
25
+ <a href="classes/LongDecimal.html#M000075">& (LongDecimal)</a><br />
26
26
  <a href="classes/LongDecimalQuot.html#M000017">* (LongDecimalQuot)</a><br />
27
- <a href="classes/LongDecimal.html#M000065">* (LongDecimal)</a><br />
28
- <a href="classes/LongDecimal.html#M000070">** (LongDecimal)</a><br />
27
+ <a href="classes/LongDecimal.html#M000067">* (LongDecimal)</a><br />
28
+ <a href="classes/LongDecimal.html#M000072">** (LongDecimal)</a><br />
29
29
  <a href="classes/LongDecimalQuot.html#M000019">** (LongDecimalQuot)</a><br />
30
30
  <a href="classes/LongDecimalQuot.html#M000015">+ (LongDecimalQuot)</a><br />
31
- <a href="classes/LongDecimal.html#M000063">+ (LongDecimal)</a><br />
32
- <a href="classes/LongDecimalBase.html#M000105">+@ (LongDecimalBase)</a><br />
33
- <a href="classes/LongDecimal.html#M000064">- (LongDecimal)</a><br />
31
+ <a href="classes/LongDecimal.html#M000065">+ (LongDecimal)</a><br />
32
+ <a href="classes/LongDecimalBase.html#M000107">+@ (LongDecimalBase)</a><br />
33
+ <a href="classes/LongDecimal.html#M000066">- (LongDecimal)</a><br />
34
34
  <a href="classes/LongDecimalQuot.html#M000016">- (LongDecimalQuot)</a><br />
35
- <a href="classes/LongDecimal.html#M000062">-@ (LongDecimal)</a><br />
35
+ <a href="classes/LongDecimal.html#M000064">-@ (LongDecimal)</a><br />
36
36
  <a href="classes/LongDecimalQuot.html#M000014">-@ (LongDecimalQuot)</a><br />
37
- <a href="classes/LongDecimal.html#M000069">/ (LongDecimal)</a><br />
37
+ <a href="classes/LongDecimal.html#M000071">/ (LongDecimal)</a><br />
38
38
  <a href="classes/LongDecimalQuot.html#M000018">/ (LongDecimalQuot)</a><br />
39
- <a href="classes/LongDecimal.html#M000077"><< (LongDecimal)</a><br />
40
- <a href="classes/LongMath/CacheKey.html#M000140"><=> (LongMath::CacheKey)</a><br />
41
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000141"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
42
- <a href="classes/LongDecimalBase.html#M000110"><=> (LongDecimalBase)</a><br />
43
- <a href="classes/LongDecimal.html#M000094">== (LongDecimal)</a><br />
39
+ <a href="classes/LongDecimal.html#M000079"><< (LongDecimal)</a><br />
40
+ <a href="classes/LongMath/CacheKey.html#M000145"><=> (LongMath::CacheKey)</a><br />
41
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000146"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
42
+ <a href="classes/LongDecimalBase.html#M000112"><=> (LongDecimalBase)</a><br />
43
+ <a href="classes/LongDecimal.html#M000096">== (LongDecimal)</a><br />
44
44
  <a href="classes/LongDecimalQuot.html#M000025">== (LongDecimalQuot)</a><br />
45
- <a href="classes/LongDecimal.html#M000095">=== (LongDecimal)</a><br />
46
- <a href="classes/LongDecimal.html#M000078">>> (LongDecimal)</a><br />
45
+ <a href="classes/LongDecimal.html#M000097">=== (LongDecimal)</a><br />
46
+ <a href="classes/LongDecimal.html#M000080">>> (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#M000079">[] (LongDecimal)</a><br />
50
- <a href="classes/LongDecimal.html#M000075">^ (LongDecimal)</a><br />
49
+ <a href="classes/LongDecimal.html#M000081">[] (LongDecimal)</a><br />
50
+ <a href="classes/LongDecimal.html#M000077">^ (LongDecimal)</a><br />
51
51
  <a href="classes/LongDecimalQuot.html#M000022">abs (LongDecimalQuot)</a><br />
52
- <a href="classes/LongDecimal.html#M000088">abs (LongDecimal)</a><br />
53
- <a href="classes/LongDecimalBase.html#M000109">abs2 (LongDecimalBase)</a><br />
54
- <a href="classes/LongDecimal.html#M000055">anti_equalize_scale (LongDecimal)</a><br />
55
- <a href="classes/LongMath.html#M000114">check_is_int (LongMath)</a><br />
56
- <a href="classes/LongMath.html#M000115">check_is_ld (LongMath)</a><br />
57
- <a href="classes/LongMath.html#M000117">check_is_mode (LongMath)</a><br />
58
- <a href="classes/LongMath.html#M000116">check_is_prec (LongMath)</a><br />
59
- <a href="classes/LongMath.html#M000113">check_word_len (LongMath)</a><br />
60
- <a href="classes/LongDecimal.html#M000089">coerce (LongDecimal)</a><br />
52
+ <a href="classes/LongDecimal.html#M000090">abs (LongDecimal)</a><br />
53
+ <a href="classes/LongDecimalBase.html#M000111">abs2 (LongDecimalBase)</a><br />
54
+ <a href="classes/LongDecimal.html#M000057">anti_equalize_scale (LongDecimal)</a><br />
55
+ <a href="classes/LongMath.html#M000142">calc_iprec_for_power (LongMath)</a><br />
56
+ <a href="classes/LongMath.html#M000116">check_is_int (LongMath)</a><br />
57
+ <a href="classes/LongMath.html#M000117">check_is_ld (LongMath)</a><br />
58
+ <a href="classes/LongMath.html#M000119">check_is_mode (LongMath)</a><br />
59
+ <a href="classes/LongMath.html#M000118">check_is_prec (LongMath)</a><br />
60
+ <a href="classes/LongMath.html#M000115">check_word_len (LongMath)</a><br />
61
+ <a href="classes/LongDecimal.html#M000091">coerce (LongDecimal)</a><br />
61
62
  <a href="classes/LongDecimalQuot.html#M000024">coerce (LongDecimalQuot)</a><br />
62
- <a href="classes/LongDecimalBase.html#M000104">dec (LongDecimalBase)</a><br />
63
- <a href="classes/LongDecimal.html#M000060">dec! (LongDecimal)</a><br />
63
+ <a href="classes/LongDecimalBase.html#M000106">dec (LongDecimalBase)</a><br />
64
+ <a href="classes/LongDecimal.html#M000062">dec! (LongDecimal)</a><br />
64
65
  <a href="classes/LongDecimalQuot.html#M000013">dec! (LongDecimalQuot)</a><br />
65
66
  <a href="classes/LongDecimalQuot.html#M000006">denominator (LongDecimalQuot)</a><br />
66
- <a href="classes/LongDecimal.html#M000051">denominator (LongDecimal)</a><br />
67
- <a href="classes/LongDecimal.html#M000066">divide (LongDecimal)</a><br />
68
- <a href="classes/LongDecimal.html#M000067">divide_s (LongDecimal)</a><br />
69
- <a href="classes/LongDecimal.html#M000071">divmod (LongDecimal)</a><br />
67
+ <a href="classes/LongDecimal.html#M000052">denominator (LongDecimal)</a><br />
68
+ <a href="classes/LongDecimal.html#M000068">divide (LongDecimal)</a><br />
69
+ <a href="classes/LongDecimal.html#M000069">divide_s (LongDecimal)</a><br />
70
+ <a href="classes/LongDecimal.html#M000073">divmod (LongDecimal)</a><br />
70
71
  <a href="classes/LongDecimalQuot.html#M000020">divmod (LongDecimalQuot)</a><br />
71
- <a href="classes/LongDecimal.html#M000054">equalize_scale (LongDecimal)</a><br />
72
- <a href="classes/LongMath.html#M000127">exp (LongMath)</a><br />
73
- <a href="classes/LongMath.html#M000129">exp10 (LongMath)</a><br />
74
- <a href="classes/LongMath.html#M000128">exp2 (LongMath)</a><br />
75
- <a href="classes/LongMath.html#M000130">exp_internal (LongMath)</a><br />
76
- <a href="classes/LongMath.html#M000131">exp_raw (LongMath)</a><br />
77
- <a href="classes/LongMath.html#M000124">gcd_with_high_power (LongMath)</a><br />
78
- <a href="classes/LongDecimal.html#M000098">hash (LongDecimal)</a><br />
72
+ <a href="classes/LongDecimal.html#M000056">equalize_scale (LongDecimal)</a><br />
73
+ <a href="classes/LongMath.html#M000131">exp (LongMath)</a><br />
74
+ <a href="classes/LongMath.html#M000133">exp10 (LongMath)</a><br />
75
+ <a href="classes/LongMath.html#M000132">exp2 (LongMath)</a><br />
76
+ <a href="classes/LongMath.html#M000134">exp_internal (LongMath)</a><br />
77
+ <a href="classes/LongMath.html#M000135">exp_raw (LongMath)</a><br />
78
+ <a href="classes/LongMath.html#M000126">gcd_with_high_power (LongMath)</a><br />
79
79
  <a href="classes/LongDecimalQuot.html#M000032">hash (LongDecimalQuot)</a><br />
80
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000142">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
81
- <a href="classes/LongDecimalBase.html#M000103">inc (LongDecimalBase)</a><br />
82
- <a href="classes/LongDecimal.html#M000059">inc! (LongDecimal)</a><br />
80
+ <a href="classes/LongDecimal.html#M000100">hash (LongDecimal)</a><br />
81
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000147">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
82
+ <a href="classes/LongDecimalBase.html#M000105">inc (LongDecimalBase)</a><br />
83
+ <a href="classes/LongDecimal.html#M000061">inc! (LongDecimal)</a><br />
83
84
  <a href="classes/LongDecimalQuot.html#M000012">inc! (LongDecimalQuot)</a><br />
84
85
  <a href="classes/LongDecimalQuot.html#M000033">inspect (LongDecimalQuot)</a><br />
85
- <a href="classes/LongDecimal.html#M000099">inspect (LongDecimal)</a><br />
86
- <a href="classes/LongDecimal.html#M000053">int_digits10 (LongDecimal)</a><br />
87
- <a href="classes/LongDecimal.html#M000052">int_digits2 (LongDecimal)</a><br />
88
- <a href="classes/LongDecimalBase.html#M000108">inverse (LongDecimalBase)</a><br />
86
+ <a href="classes/LongDecimal.html#M000101">inspect (LongDecimal)</a><br />
87
+ <a href="classes/LongDecimal.html#M000055">int_digits10 (LongDecimal)</a><br />
88
+ <a href="classes/LongMath.html#M000129">int_digits10 (LongMath)</a><br />
89
+ <a href="classes/LongDecimal.html#M000053">int_digits2 (LongDecimal)</a><br />
90
+ <a href="classes/LongDecimalBase.html#M000110">inverse (LongDecimalBase)</a><br />
89
91
  <a href="classes/LongDecimalQuot.html#M000028">is_int? (LongDecimalQuot)</a><br />
90
- <a href="classes/LongDecimal.html#M000090">is_int? (LongDecimal)</a><br />
91
- <a href="classes/LongMath.html#M000133">log (LongMath)</a><br />
92
- <a href="classes/LongMath.html#M000134">log10 (LongMath)</a><br />
93
- <a href="classes/LongMath.html#M000135">log2 (LongMath)</a><br />
94
- <a href="classes/LongMath.html#M000136">log_internal (LongMath)</a><br />
95
- <a href="classes/LongMath.html#M000137">log_raw (LongMath)</a><br />
96
- <a href="classes/LongMath.html#M000119">merge_from_words (LongMath)</a><br />
92
+ <a href="classes/LongDecimal.html#M000092">is_int? (LongDecimal)</a><br />
93
+ <a href="classes/LongMath.html#M000137">log (LongMath)</a><br />
94
+ <a href="classes/LongMath.html#M000138">log10 (LongMath)</a><br />
95
+ <a href="classes/LongMath.html#M000139">log2 (LongMath)</a><br />
96
+ <a href="classes/LongMath.html#M000140">log_internal (LongMath)</a><br />
97
+ <a href="classes/LongMath.html#M000141">log_raw (LongMath)</a><br />
98
+ <a href="classes/LongMath.html#M000121">merge_from_words (LongMath)</a><br />
97
99
  <a href="classes/LongDecimal.html#M000039">minus_one! (LongDecimal)</a><br />
98
- <a href="classes/LongDecimal.html#M000081">move_point_left (LongDecimal)</a><br />
99
- <a href="classes/LongDecimal.html#M000083">move_point_left_int (LongDecimal)</a><br />
100
- <a href="classes/LongDecimal.html#M000082">move_point_right (LongDecimal)</a><br />
101
- <a href="classes/LongDecimal.html#M000084">move_point_right_int (LongDecimal)</a><br />
102
- <a href="classes/LongMath.html#M000125">multiplicity_of_factor (LongMath)</a><br />
100
+ <a href="classes/LongDecimal.html#M000083">move_point_left (LongDecimal)</a><br />
101
+ <a href="classes/LongDecimal.html#M000085">move_point_left_int (LongDecimal)</a><br />
102
+ <a href="classes/LongDecimal.html#M000084">move_point_right (LongDecimal)</a><br />
103
+ <a href="classes/LongDecimal.html#M000086">move_point_right_int (LongDecimal)</a><br />
104
+ <a href="classes/LongMath.html#M000128">multiplicity_of_10 (LongMath)</a><br />
105
+ <a href="classes/LongMath.html#M000127">multiplicity_of_factor (LongMath)</a><br />
103
106
  <a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
104
107
  <a href="classes/LongDecimal.html#M000041">new (LongDecimal)</a><br />
105
- <a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
106
108
  <a href="classes/LongDecimal.html#M000034">new! (LongDecimal)</a><br />
107
- <a href="classes/LongDecimal.html#M000057">next (LongDecimal)</a><br />
109
+ <a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
110
+ <a href="classes/LongDecimal.html#M000059">next (LongDecimal)</a><br />
108
111
  <a href="classes/LongDecimalQuot.html#M000005">numerator (LongDecimalQuot)</a><br />
109
112
  <a href="classes/LongDecimal.html#M000036">one! (LongDecimal)</a><br />
110
113
  <a href="classes/LongDecimalQuot.html#M000027">one? (LongDecimalQuot)</a><br />
111
- <a href="classes/LongDecimal.html#M000097">one? (LongDecimal)</a><br />
112
- <a href="classes/LongMath.html#M000126">pi (LongMath)</a><br />
113
- <a href="classes/LongMath.html#M000138">power (LongMath)</a><br />
114
- <a href="classes/LongMath.html#M000139">power_internal (LongMath)</a><br />
114
+ <a href="classes/LongDecimal.html#M000099">one? (LongDecimal)</a><br />
115
+ <a href="classes/LongMath.html#M000130">pi (LongMath)</a><br />
116
+ <a href="classes/LongMath.html#M000143">power (LongMath)</a><br />
117
+ <a href="classes/LongMath.html#M000144">power_internal (LongMath)</a><br />
115
118
  <a href="classes/LongDecimal.html#M000040">power_of_ten! (LongDecimal)</a><br />
116
- <a href="classes/LongDecimal.html#M000058">pred (LongDecimal)</a><br />
117
- <a href="classes/LongDecimal.html#M000068">rdiv (LongDecimal)</a><br />
118
- <a href="classes/LongDecimalBase.html#M000107">reciprocal (LongDecimalBase)</a><br />
119
- <a href="classes/LongDecimal.html#M000043">round_to_scale (LongDecimal)</a><br />
119
+ <a href="classes/LongDecimal.html#M000060">pred (LongDecimal)</a><br />
120
+ <a href="classes/LongDecimal.html#M000070">rdiv (LongDecimal)</a><br />
121
+ <a href="classes/LongDecimalBase.html#M000109">reciprocal (LongDecimalBase)</a><br />
120
122
  <a href="classes/LongDecimalQuot.html#M000023">round_to_scale (LongDecimalQuot)</a><br />
123
+ <a href="classes/LongDecimal.html#M000044">round_to_scale (LongDecimal)</a><br />
124
+ <a href="classes/LongDecimal.html#M000043">round_trailing_zeros (LongDecimal)</a><br />
121
125
  <a href="classes/LongDecimal.html#M000042">scale= (LongDecimal)</a><br />
122
- <a href="classes/LongDecimalBase.html#M000112">scale_equal (LongDecimalBase)</a><br />
123
- <a href="classes/LongDecimalBase.html#M000111">scale_ufo (LongDecimalBase)</a><br />
124
- <a href="classes/LongDecimal.html#M000091">sgn (LongDecimal)</a><br />
126
+ <a href="classes/LongDecimalBase.html#M000114">scale_equal (LongDecimalBase)</a><br />
127
+ <a href="classes/LongDecimalBase.html#M000113">scale_ufo (LongDecimalBase)</a><br />
125
128
  <a href="classes/LongDecimalQuot.html#M000029">sgn (LongDecimalQuot)</a><br />
129
+ <a href="classes/LongDecimal.html#M000093">sgn (LongDecimal)</a><br />
130
+ <a href="classes/LongDecimal.html#M000095">sign (LongDecimal)</a><br />
126
131
  <a href="classes/LongDecimalQuot.html#M000031">sign (LongDecimalQuot)</a><br />
127
- <a href="classes/LongDecimal.html#M000093">sign (LongDecimal)</a><br />
132
+ <a href="classes/LongDecimal.html#M000094">signum (LongDecimal)</a><br />
128
133
  <a href="classes/LongDecimalQuot.html#M000030">signum (LongDecimalQuot)</a><br />
129
- <a href="classes/LongDecimal.html#M000092">signum (LongDecimal)</a><br />
130
- <a href="classes/LongDecimal.html#M000080">size (LongDecimal)</a><br />
131
- <a href="classes/LongMath.html#M000118">split_to_words (LongMath)</a><br />
132
- <a href="classes/LongMath.html#M000132">sqrt (LongMath)</a><br />
133
- <a href="classes/LongDecimal.html#M000086">sqrt (LongDecimal)</a><br />
134
- <a href="classes/LongDecimal.html#M000087">sqrt_with_remainder (LongDecimal)</a><br />
135
- <a href="classes/LongMath.html#M000120">sqrtb (LongMath)</a><br />
136
- <a href="classes/LongMath.html#M000121">sqrtb_with_remainder (LongMath)</a><br />
137
- <a href="classes/LongMath.html#M000122">sqrtw (LongMath)</a><br />
138
- <a href="classes/LongMath.html#M000123">sqrtw_with_remainder (LongMath)</a><br />
139
- <a href="classes/LongDecimal.html#M000085">square (LongDecimal)</a><br />
140
- <a href="classes/LongDecimalBase.html#M000106">square (LongDecimalBase)</a><br />
141
- <a href="classes/LongDecimal.html#M000056">succ (LongDecimal)</a><br />
134
+ <a href="classes/LongDecimal.html#M000054">sint_digits10 (LongDecimal)</a><br />
135
+ <a href="classes/LongDecimal.html#M000082">size (LongDecimal)</a><br />
136
+ <a href="classes/LongMath.html#M000120">split_to_words (LongMath)</a><br />
137
+ <a href="classes/LongMath.html#M000136">sqrt (LongMath)</a><br />
138
+ <a href="classes/LongDecimal.html#M000088">sqrt (LongDecimal)</a><br />
139
+ <a href="classes/LongDecimal.html#M000089">sqrt_with_remainder (LongDecimal)</a><br />
140
+ <a href="classes/LongMath.html#M000122">sqrtb (LongMath)</a><br />
141
+ <a href="classes/LongMath.html#M000123">sqrtb_with_remainder (LongMath)</a><br />
142
+ <a href="classes/LongMath.html#M000124">sqrtw (LongMath)</a><br />
143
+ <a href="classes/LongMath.html#M000125">sqrtw_with_remainder (LongMath)</a><br />
144
+ <a href="classes/LongDecimal.html#M000087">square (LongDecimal)</a><br />
145
+ <a href="classes/LongDecimalBase.html#M000108">square (LongDecimalBase)</a><br />
146
+ <a href="classes/LongDecimal.html#M000058">succ (LongDecimal)</a><br />
142
147
  <a href="classes/LongDecimal.html#M000038">ten! (LongDecimal)</a><br />
143
- <a href="classes/LongDecimal.html#M000050">to_bd (LongDecimal)</a><br />
144
148
  <a href="classes/LongDecimalQuot.html#M000009">to_bd (LongDecimalQuot)</a><br />
149
+ <a href="classes/LongDecimal.html#M000051">to_bd (LongDecimal)</a><br />
150
+ <a href="classes/LongDecimal.html#M000048">to_f (LongDecimal)</a><br />
145
151
  <a href="classes/LongDecimalQuot.html#M000008">to_f (LongDecimalQuot)</a><br />
146
- <a href="classes/LongDecimal.html#M000047">to_f (LongDecimal)</a><br />
147
- <a href="classes/LongDecimal.html#M000048">to_i (LongDecimal)</a><br />
148
152
  <a href="classes/LongDecimalQuot.html#M000010">to_i (LongDecimalQuot)</a><br />
149
- <a href="classes/Numeric.html#M000100">to_ld (Numeric)</a><br />
150
- <a href="classes/LongDecimal.html#M000049">to_ld (LongDecimal)</a><br />
153
+ <a href="classes/LongDecimal.html#M000049">to_i (LongDecimal)</a><br />
154
+ <a href="classes/Rational.html#M000103">to_ld (Rational)</a><br />
155
+ <a href="classes/LongDecimal.html#M000050">to_ld (LongDecimal)</a><br />
151
156
  <a href="classes/LongDecimalQuot.html#M000011">to_ld (LongDecimalQuot)</a><br />
152
- <a href="classes/Rational.html#M000101">to_ld (Rational)</a><br />
153
- <a href="classes/LongDecimalBase.html#M000102">to_r (LongDecimalBase)</a><br />
154
- <a href="classes/LongDecimal.html#M000044">to_s (LongDecimal)</a><br />
157
+ <a href="classes/Numeric.html#M000102">to_ld (Numeric)</a><br />
158
+ <a href="classes/LongDecimalBase.html#M000104">to_r (LongDecimalBase)</a><br />
155
159
  <a href="classes/LongDecimalQuot.html#M000007">to_s (LongDecimalQuot)</a><br />
156
- <a href="classes/LongDecimal.html#M000045">to_s_10 (LongDecimal)</a><br />
157
- <a href="classes/LongDecimal.html#M000046">to_s_internal (LongDecimal)</a><br />
160
+ <a href="classes/LongDecimal.html#M000045">to_s (LongDecimal)</a><br />
161
+ <a href="classes/LongDecimal.html#M000046">to_s_10 (LongDecimal)</a><br />
162
+ <a href="classes/LongDecimal.html#M000047">to_s_internal (LongDecimal)</a><br />
158
163
  <a href="classes/LongDecimal.html#M000037">two! (LongDecimal)</a><br />
159
- <a href="classes/LongDecimal.html#M000061">unit (LongDecimal)</a><br />
164
+ <a href="classes/LongDecimal.html#M000063">unit (LongDecimal)</a><br />
160
165
  <a href="classes/LongDecimal.html#M000035">zero! (LongDecimal)</a><br />
161
- <a href="classes/LongDecimal.html#M000096">zero? (LongDecimal)</a><br />
162
166
  <a href="classes/LongDecimalQuot.html#M000026">zero? (LongDecimalQuot)</a><br />
163
- <a href="classes/LongDecimal.html#M000074">| (LongDecimal)</a><br />
164
- <a href="classes/LongDecimal.html#M000076">~ (LongDecimal)</a><br />
167
+ <a href="classes/LongDecimal.html#M000098">zero? (LongDecimal)</a><br />
168
+ <a href="classes/LongDecimal.html#M000076">| (LongDecimal)</a><br />
169
+ <a href="classes/LongDecimal.html#M000078">~ (LongDecimal)</a><br />
165
170
  </div>
166
171
  </div>
167
172
  </body>
data/lib/long-decimal.rb CHANGED
@@ -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.19 2006/04/01 08:52:06 bk1 Exp $
5
- # CVS-Label: $Name: PRE_ALPHA_0_19 $
4
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.20 2006/04/02 15:52:27 bk1 Exp $
5
+ # CVS-Label: $Name: PRE_ALPHA_0_20 $
6
6
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
7
  #
8
8
  require "complex"
@@ -61,7 +61,7 @@ end # LongDecimalRoundingMode
61
61
  # common base class for LongDecimal and LongDecimalQuot
62
62
  #
63
63
  class LongDecimalBase < Numeric
64
- @RCS_ID='-$Id: long-decimal.rb,v 1.19 2006/04/01 08:52:06 bk1 Exp $-'
64
+ @RCS_ID='-$Id: long-decimal.rb,v 1.20 2006/04/02 15:52:27 bk1 Exp $-'
65
65
 
66
66
  include LongDecimalRoundingMode
67
67
 
@@ -164,7 +164,7 @@ end # class LongDecimalBase
164
164
  # digits and the other one the position of the decimal point.
165
165
  #
166
166
  class LongDecimal < LongDecimalBase
167
- @RCS_ID='-$Id: long-decimal.rb,v 1.19 2006/04/01 08:52:06 bk1 Exp $-'
167
+ @RCS_ID='-$Id: long-decimal.rb,v 1.20 2006/04/02 15:52:27 bk1 Exp $-'
168
168
 
169
169
  # MINUS_ONE = LongDecimal(-1)
170
170
  # ZERO = LongDecimal(0)
@@ -273,8 +273,8 @@ class LongDecimal < LongDecimalBase
273
273
  # we need to come up with a better rule here.
274
274
  # if denominator is any product of powers of 2 and 5, we do not need to round
275
275
  denom = x.denominator
276
- mul_2 = LongMath.multiplicity_of_factor(denom, 2)
277
- mul_5 = LongMath.multiplicity_of_factor(denom, 5)
276
+ mul_2 = LongMath.multiplicity_of_factor(denom, 2)
277
+ mul_5 = LongMath.multiplicity_of_factor(denom, 5)
278
278
  iscale = [mul_2, mul_5].max
279
279
  scale += iscale
280
280
  denom /= 2 ** mul_2
@@ -342,8 +342,14 @@ class LongDecimal < LongDecimalBase
342
342
  int_val = -int_val
343
343
  end
344
344
  end
345
- @scale = scale
346
- @int_val = int_val
345
+ # scale is the number of digits that go after the decimal point
346
+ @scale = scale
347
+ # int_val holds all the digits. The value actually expressed by self is
348
+ # int_val * 10**(-scale)
349
+ @int_val = int_val
350
+ # used for storing the number of digits before the decimal point.
351
+ # Is nil, until it is used the first time
352
+ @digits10 = nil
347
353
 
348
354
  end # initialize
349
355
 
@@ -371,12 +377,27 @@ class LongDecimal < LongDecimalBase
371
377
  # here we actually do rounding
372
378
  @int_val = (@int_val / f).to_i
373
379
  end
374
- @scale = s
380
+ @scale = s
381
+ @digits10 = nil
375
382
  end
376
383
  end
377
384
 
378
385
  protected :scale=
379
386
 
387
+ #
388
+ # get rid of trailing zeros
389
+ #
390
+ def round_trailing_zeros
391
+ n = LongMath.multiplicity_of_10(int_val)
392
+ if (n.zero?) then
393
+ return self
394
+ end
395
+ if (n > scale) then
396
+ n = scale
397
+ end
398
+ return self.round_to_scale(scale - n)
399
+ end
400
+
380
401
  #
381
402
  # create copy of self with different scale
382
403
  # param1: new_scale new scale for result
@@ -584,43 +605,39 @@ class LongDecimal < LongDecimalBase
584
605
  n
585
606
  end
586
607
 
608
+ #
609
+ # number of decimal digits before the decimal point, not counting a
610
+ # single 0. negative value, if some zeros follow immediately after
611
+ # decimal point
612
+ #
613
+ # 0.000x -> -3
614
+ # 0.00x -> -2
615
+ # 0.0xx -> -1
616
+ # 0.xxx -> 0
617
+ # 1.xxx -> 1
618
+ # 10.xxx -> 2
619
+ # 99.xxx -> 2
620
+ # 100.xxx -> 3
621
+ # ...
622
+ #
623
+ def sint_digits10
624
+ if (@digits10.nil?)
625
+ @digits10 = LongMath.int_digits10(int_val) - scale
626
+ end
627
+ @digits10
628
+ end
629
+
587
630
  #
588
631
  # number of decimal digits before the decimal point, not counting a
589
632
  # single 0.
633
+ # 0.0xx -> 0
590
634
  # 0.xxx -> 0
591
635
  # 1.xxx -> 1
592
636
  # 10.xxx -> 2
593
637
  # ...
594
638
  #
595
639
  def int_digits10
596
- int_part = self.abs.to_i
597
- if int_part.zero? then
598
- return 0
599
- end
600
-
601
- id = 1
602
- powers = []
603
- power = 10
604
- idx = 0
605
- until int_part.zero? do
606
- expon = 1 << idx
607
- powers[idx] = power
608
- break if int_part < power
609
- id += expon
610
- int_part = (int_part / power).to_i
611
- idx += 1
612
- power = power * power
613
- end
614
- until int_part < 10 do
615
- idx -= 1
616
- expon = 1 << idx
617
- power = powers[idx]
618
- while int_part >= power
619
- id += expon
620
- int_part = (int_part / power).to_i
621
- end
622
- end
623
- id
640
+ return [ sint_digits10, 0 ].max
624
641
  end
625
642
 
626
643
  #
@@ -688,6 +705,7 @@ class LongDecimal < LongDecimalBase
688
705
  #
689
706
  def inc!
690
707
  @int_val += denominator
708
+ @digits10 = nil
691
709
  end
692
710
 
693
711
  #
@@ -695,6 +713,7 @@ class LongDecimal < LongDecimalBase
695
713
  #
696
714
  def dec!
697
715
  @int_val -= denominator
716
+ @digits10 = nil
698
717
  end
699
718
 
700
719
  #
@@ -1166,7 +1185,8 @@ class LongDecimal < LongDecimalBase
1166
1185
  # equality of the number of digits.
1167
1186
  #
1168
1187
  def ===(other)
1169
- (other.kind_of? LongDecimal) && self.int_val == other.int_val
1188
+ # (other.kind_of? LongDecimal) && self.int_val == other.int_val
1189
+ (self <=> other).zero?
1170
1190
  end
1171
1191
 
1172
1192
  #
@@ -1208,7 +1228,7 @@ end # LongDecimal
1208
1228
  #
1209
1229
  class LongDecimalQuot < LongDecimalBase
1210
1230
 
1211
- @RCS_ID='-$Id: long-decimal.rb,v 1.19 2006/04/01 08:52:06 bk1 Exp $-'
1231
+ @RCS_ID='-$Id: long-decimal.rb,v 1.20 2006/04/02 15:52:27 bk1 Exp $-'
1212
1232
 
1213
1233
  #
1214
1234
  # constructor
@@ -1229,13 +1249,30 @@ class LongDecimalQuot < LongDecimalBase
1229
1249
  #
1230
1250
  def initialize(first, second)
1231
1251
  if ((first.kind_of? Rational) || (first.kind_of? Integer)) && (second.kind_of? Integer) then
1232
- @rat = Rational(first.numerator, first.denominator)
1252
+ @rat = Rational(first.numerator, first.denominator)
1233
1253
  @scale = second
1254
+
1234
1255
  elsif (first.kind_of? LongDecimal) && (second.kind_of? LongDecimal) then
1235
- orig_scale = first.scale
1256
+ # calculate the number of digits after the decimal point we can
1257
+ # be confident about. Use 0, if we do not have any confidence
1258
+ # about any digits after the decimal point. The formula has
1259
+ # been obtained by using the partial derivatives of f(x, y) =
1260
+ # x/y and assuming that sx and sy are the number of digits we
1261
+ # know after the decimal point and dx and dy are the number of
1262
+ # digits before the decimal point. Since division is usually
1263
+ # not expressable exactly in decimal digits, it is up to the
1264
+ # calling application to decide on the number of digits actually
1265
+ # used for the result, which can be more that new_scale.
1266
+ sx = first.scale
1267
+ sy = second.scale
1268
+ dx = first.sint_digits10
1269
+ dy = second.sint_digits10
1270
+ new_scale = [ 0, 2 * dy + sx + sy - [ dx + sx, dy + sy ].max - 3].max
1271
+ # puts("sx=#{sx} sy=#{sy} dx=#{dx} dy=#{dy} sc=#{new_scale} x=#{first} y=#{second}\n")
1272
+
1236
1273
  first, second = first.anti_equalize_scale(second)
1237
- @rat = Rational(first.to_i, second.to_i)
1238
- @scale = orig_scale
1274
+ @rat = Rational(first.to_i, second.to_i)
1275
+ @scale = new_scale
1239
1276
  else
1240
1277
  raise TypeError, "parameters must be (LongDecimal, LongDecimal) or (Rational, Integer): first=#{first.inspect} second=#{second.inspect}";
1241
1278
  end
@@ -1793,7 +1830,7 @@ module LongMath
1793
1830
  if (arg.kind_of? Integer) || (arg.kind_of? LongDecimalBase) && arg.is_int? then
1794
1831
  arg = arg.to_i
1795
1832
  unless (allowed_args.index(arg).nil?)
1796
- key = CacheKey.new(fname, arg, mode)
1833
+ key = CacheKey.new(fname, arg, mode)
1797
1834
  end
1798
1835
  end
1799
1836
  return key
@@ -1824,11 +1861,11 @@ module LongMath
1824
1861
  oval = @@cache[key]
1825
1862
  # puts("set key=#{key}\noval=#{oval}\nval=#{val}\n")
1826
1863
  unless (oval.nil?)
1827
- raise TypeError, "must be LongDecimal" unless (val.kind_of? LongDecimal) && (oval.kind_of? LongDecimal)
1828
- r = val.scale_ufo(oval)
1829
- if (r <= 0)
1830
- return
1831
- end
1864
+ raise TypeError, "must be LongDecimal" unless (val.kind_of? LongDecimal) && (oval.kind_of? LongDecimal)
1865
+ r = val.scale_ufo(oval)
1866
+ if (r <= 0)
1867
+ return
1868
+ end
1832
1869
  end
1833
1870
  @@cache[key] = val
1834
1871
  end
@@ -2113,8 +2150,55 @@ module LongMath
2113
2150
  else
2114
2151
  raise TypeError, "type of x is not supported #{x.class} #{x.inpect}"
2115
2152
  end
2153
+ end # multiplicity_of_factor
2154
+
2155
+ #
2156
+ # how many times can n be divided by 10?
2157
+ #
2158
+ def LongMath.multiplicity_of_10(n)
2159
+ mul_2 = LongMath.multiplicity_of_factor(n, 2)
2160
+ mul_5 = LongMath.multiplicity_of_factor(n, 5)
2161
+ [mul_2, mul_5].min
2116
2162
  end
2117
2163
 
2164
+
2165
+ #
2166
+ # find number of digits in base 10 needed to express the given
2167
+ # number n
2168
+ #
2169
+ def LongMath.int_digits10(n)
2170
+
2171
+ n = n.abs
2172
+ if n.zero? then
2173
+ return 0
2174
+ end
2175
+
2176
+ id = 1
2177
+ powers = []
2178
+ power = 10
2179
+ idx = 0
2180
+ until n.zero? do
2181
+ expon = 1 << idx
2182
+ powers[idx] = power
2183
+ break if n < power
2184
+ id += expon
2185
+ n = (n / power).to_i
2186
+ idx += 1
2187
+ power = power * power
2188
+ end
2189
+
2190
+ until n < 10 do
2191
+ idx -= 1
2192
+ expon = 1 << idx
2193
+ power = powers[idx]
2194
+ while n >= power
2195
+ id += expon
2196
+ n = (n / power).to_i
2197
+ end
2198
+ end
2199
+ return id
2200
+ end # int_digits10
2201
+
2118
2202
  #
2119
2203
  # method for calculating pi to the given number of digits after the
2120
2204
  # decimal point.
@@ -2176,7 +2260,7 @@ module LongMath
2176
2260
  k += 1
2177
2261
  pow_k = pow_k << 1
2178
2262
  end
2179
- set_cached(cache_key, curr_pi) if cache_result
2263
+ set_cached(cache_key, curr_pi) if cache_result
2180
2264
  end
2181
2265
  curr_pi.round_to_scale(prec, final_mode)
2182
2266
  end
@@ -2300,7 +2384,7 @@ module LongMath
2300
2384
  iprec = calc_iprec_for_exp(x, prec)
2301
2385
  end
2302
2386
  check_is_prec(iprec, "iprec")
2303
-
2387
+
2304
2388
  # we only cache exp(1)
2305
2389
  cache_key = get_cache_key("exp", x, mode, [1])
2306
2390
  y_k = get_cached(cache_key, x, iprec)
@@ -2318,7 +2402,7 @@ module LongMath
2318
2402
 
2319
2403
  #
2320
2404
  # calculation of exp(x) with precision used internally. Needs to be
2321
- # rounded to be accurate to all digits that are provided.
2405
+ # rounded to be accurate to all digits that are provided.
2322
2406
  #
2323
2407
  def LongMath.exp_raw(x, prec, j, k, iprec, mode)
2324
2408
  # dprec = [ (iprec*0.9).round , (prec + 1) << 1 ].min
@@ -2336,9 +2420,9 @@ module LongMath
2336
2420
  f = 0
2337
2421
  loop do
2338
2422
  j.times do |i|
2339
- s[i] += t
2340
- f += 1
2341
- t = (t / f).round_to_scale(iprec, mode)
2423
+ s[i] += t
2424
+ f += 1
2425
+ t = (t / f).round_to_scale(iprec, mode)
2342
2426
  end
2343
2427
  t = (t * x_j).round_to_scale(iprec, mode)
2344
2428
  break if (t.zero?)
@@ -2352,7 +2436,7 @@ module LongMath
2352
2436
  y_k = LongDecimal(0)
2353
2437
  j.times do |i|
2354
2438
  if (i > 0) then
2355
- x_i = (x_i * x_k).round_to_scale(iprec, mode)
2439
+ x_i = (x_i * x_k).round_to_scale(iprec, mode)
2356
2440
  end
2357
2441
  y_k += (s[i] * x_i).round_to_scale(iprec, mode)
2358
2442
  end
@@ -2392,7 +2476,7 @@ module LongMath
2392
2476
  # LongDecimal.
2393
2477
  #
2394
2478
  def LongMath.log10(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2395
- # check_is_ld(x, "x")
2479
+
2396
2480
  check_is_prec(prec, "prec")
2397
2481
  check_is_mode(mode, "mode")
2398
2482
  iprec = prec + 2
@@ -2405,9 +2489,8 @@ module LongMath
2405
2489
 
2406
2490
  id = x.int_digits10
2407
2491
  xx = x.move_point_left(id)
2408
- # puts("x=#{x} xx=#{xx} id=#{id} iprec=#{iprec}\n")
2409
2492
  lnxx = log_internal(xx, iprec, mode)
2410
- ln10 = log_internal(10.to_ld, iprec, mode)
2493
+ ln10 = log_internal(10, iprec, mode)
2411
2494
  y = id + (lnxx / ln10).round_to_scale(prec, mode)
2412
2495
  return y
2413
2496
  end
@@ -2489,8 +2572,8 @@ module LongMath
2489
2572
  #
2490
2573
  # calculate log with all digits used internally.
2491
2574
  # result needs to be rounded in order to ensure that all digits that
2492
- # are provided are correct.
2493
- #
2575
+ # are provided are correct.
2576
+ #
2494
2577
  def LongMath.log_raw(x, prec, iprec, mode)
2495
2578
 
2496
2579
  # dprec = [ iprec - 1, (prec + 1) << 1 ].min
@@ -2556,6 +2639,32 @@ module LongMath
2556
2639
  return y
2557
2640
  end
2558
2641
 
2642
+ private
2643
+
2644
+ #
2645
+ # internal helper method for calculating the internal precision for power
2646
+ #
2647
+ def LongMath.calc_iprec_for_power(x, y, prec)
2648
+ x_f = x.to_f
2649
+ y_f = y.to_f
2650
+ logx_f = Math.log(x_f.abs)
2651
+ logy_f = Math.log(y_f.abs)
2652
+ logx_y_f = logx_f * y_f
2653
+ iprec_x = calc_iprec_for_exp(logx_y_f, prec)
2654
+ iprec_y = iprec_x
2655
+ iprec = iprec_x + 2
2656
+ if (logx_f < 0)
2657
+ iprec_x -= (logx_f/LOG10).round
2658
+ end
2659
+ if (logy_f < 0)
2660
+ iprec_y -= (logy_f/LOG10).round
2661
+ end
2662
+ [ iprec, iprec_x, iprec_y ]
2663
+
2664
+ end
2665
+
2666
+ public
2667
+
2559
2668
  #
2560
2669
  # calc the power of x with exponent y to the given precision as
2561
2670
  # LongDecimal. Only supports values of y such that exp(y) still
@@ -2570,6 +2679,21 @@ module LongMath
2570
2679
  check_is_prec(prec, "prec")
2571
2680
  check_is_mode(mode, "mode")
2572
2681
 
2682
+ if y.zero? then
2683
+ return LongDecimal.one!(prec)
2684
+ elsif x.zero? then
2685
+ return LongDecimal.zero!(prec)
2686
+ end
2687
+
2688
+ iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
2689
+
2690
+ unless (x.kind_of? LongDecimalBase) || (x.kind_of? Integer)
2691
+ x = x.to_ld(iprec_x, mode)
2692
+ end
2693
+ unless (y.kind_of? LongDecimalBase) || (y.kind_of? Integer)
2694
+ y = y.to_ld(iprec_y, mode)
2695
+ end
2696
+
2573
2697
  # try shortcut if exponent is an integer
2574
2698
  if (y.kind_of? LongDecimalBase) && y.is_int?
2575
2699
  y = y.to_i
@@ -2588,24 +2712,18 @@ module LongMath
2588
2712
  y = y.to_ld(prec, mode)
2589
2713
  end
2590
2714
 
2591
- # try shortcut if base is an integer
2592
- if (x.kind_of? LongDecimalBase) && x.is_int?
2593
- x = x.to_i
2594
- end
2595
- if (x.kind_of? Integer)
2596
- y0 = y.round_to_scale(0, LongDecimal::ROUND_HALF_UP).to_i
2597
- z0 = x**y0
2598
- y1 = y - y0
2599
- prec_extra = 0
2600
- if (y0 > 0)
2601
- prec_extra = (y0*Math.log10(x.to_f)).ceil
2602
- end
2603
- z1 = LongMath.power_internal(x, y1, prec+prec_extra, mode)
2604
- # puts("prec=#{prec} prec_extra=#{prec_extra} x=#{x} y0=#{y0} z0=#{z0} y1=#{y1} z1=#{z1}\n")
2605
- z = z0 * z1
2606
- return z.to_ld(prec, mode)
2715
+ # exponent is split in two parts, an integer part and a
2716
+ # LongDecimal with absolute value <= 0.5
2717
+ y0 = y.round_to_scale(0, LongDecimal::ROUND_HALF_UP).to_i
2718
+ z0 = x**y0
2719
+ y1 = y - y0
2720
+ prec_extra = 0
2721
+ if (y0 > 0)
2722
+ prec_extra = (y0*Math.log10(x.to_f).abs).ceil
2607
2723
  end
2608
- return LongMath.power_internal(x, y, prec, mode)
2724
+ z1 = LongMath.power_internal(x, y1, prec+prec_extra, mode)
2725
+ z = z0 * z1
2726
+ return z.to_ld(prec, mode)
2609
2727
  end
2610
2728
 
2611
2729
  #
@@ -2616,7 +2734,7 @@ module LongMath
2616
2734
  # not work correctly
2617
2735
  #
2618
2736
  def LongMath.power_internal(x, y, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN)
2619
- # check_is_ld(x, "x")
2737
+
2620
2738
  if (prec == nil) then
2621
2739
  if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
2622
2740
  prec = [x.scale, y.scale].max
@@ -2636,12 +2754,14 @@ module LongMath
2636
2754
  check_is_mode(final_mode, "final_mode")
2637
2755
  check_is_mode(mode, "mode")
2638
2756
 
2639
- logx_y_f = Math.log(x.to_f) * (y.to_f)
2757
+ if y.zero? then
2758
+ return LongDecimal.one!(prec)
2759
+ elsif x.zero? then
2760
+ return LongDecimal.zero!(prec)
2761
+ end
2640
2762
 
2641
- # iprec = (prec * 1.2 + 20 + (y.abs.to_f) * 1.5 * x.int_digits2).round
2642
2763
  if (iprec == nil) then
2643
- iprec = calc_iprec_for_exp(logx_y_f, prec) + 2
2644
- # puts("power_internal: prec=#{prec} iprec=#{iprec} logx_y_f=#{logx_y_f}\n")
2764
+ iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
2645
2765
  end
2646
2766
  unless (x.kind_of? LongDecimal)
2647
2767
  x = x.to_ld(iprec, mode)
@@ -2650,11 +2770,9 @@ module LongMath
2650
2770
  y = y.to_ld(iprec, mode)
2651
2771
  end
2652
2772
 
2653
- # puts("power_internal: (got iprec, x & y) x=#{x} y=#{y} logx_y=#{logx_y_f} iprec=#{iprec} prec=#{prec}\n")
2654
2773
  logx = log(x, iprec, mode)
2655
2774
  logx_y = logx*y
2656
2775
  xy = exp_internal(logx_y, prec + 1, mode)
2657
- # puts("power_internal: x=#{x} logx=#{logx} y=#{y} logx_y=#{logx_y} xy=#{xy} iprec=#{iprec} prec=#{prec}\n")
2658
2776
  xy.round_to_scale(prec, final_mode)
2659
2777
 
2660
2778
  end # power_internal