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.
- data/README +25 -22
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.html +327 -286
- data/doc/classes/LongDecimal.src/M000041.html +10 -4
- data/doc/classes/LongDecimal.src/M000042.html +3 -2
- data/doc/classes/LongDecimal.src/M000043.html +10 -26
- data/doc/classes/LongDecimal.src/M000044.html +24 -16
- data/doc/classes/LongDecimal.src/M000045.html +19 -4
- data/doc/classes/LongDecimal.src/M000046.html +4 -15
- data/doc/classes/LongDecimal.src/M000047.html +13 -26
- data/doc/classes/LongDecimal.src/M000048.html +28 -4
- data/doc/classes/LongDecimal.src/M000049.html +4 -8
- data/doc/classes/LongDecimal.src/M000050.html +8 -6
- data/doc/classes/LongDecimal.src/M000051.html +6 -4
- data/doc/classes/LongDecimal.src/M000052.html +4 -15
- data/doc/classes/LongDecimal.src/M000053.html +8 -24
- data/doc/classes/LongDecimal.src/M000054.html +6 -14
- data/doc/classes/LongDecimal.src/M000055.html +4 -13
- data/doc/classes/LongDecimal.src/M000056.html +15 -4
- data/doc/classes/LongDecimal.src/M000057.html +27 -0
- data/doc/classes/LongDecimal.src/M000058.html +4 -4
- data/doc/classes/LongDecimal.src/M000060.html +4 -4
- data/doc/classes/LongDecimal.src/M000061.html +5 -4
- data/doc/classes/LongDecimal.src/M000062.html +5 -8
- data/doc/classes/LongDecimal.src/M000063.html +4 -9
- data/doc/classes/LongDecimal.src/M000064.html +6 -7
- data/doc/classes/LongDecimal.src/M000065.html +6 -6
- data/doc/classes/LongDecimal.src/M000066.html +9 -4
- data/doc/classes/LongDecimal.src/M000067.html +7 -13
- data/doc/classes/LongDecimal.src/M000068.html +4 -9
- data/doc/classes/LongDecimal.src/M000069.html +13 -7
- data/doc/classes/LongDecimal.src/M000070.html +7 -18
- data/doc/classes/LongDecimal.src/M000071.html +8 -7
- data/doc/classes/LongDecimal.src/M000072.html +20 -5
- data/doc/classes/LongDecimal.src/M000073.html +6 -7
- data/doc/classes/LongDecimal.src/M000074.html +5 -9
- data/doc/classes/LongDecimal.src/M000075.html +5 -5
- data/doc/classes/LongDecimal.src/M000076.html +9 -4
- data/doc/classes/LongDecimal.src/M000077.html +7 -5
- data/doc/classes/LongDecimal.src/M000078.html +4 -7
- data/doc/classes/LongDecimal.src/M000079.html +7 -4
- data/doc/classes/LongDecimal.src/M000080.html +7 -4
- data/doc/classes/LongDecimal.src/M000081.html +4 -9
- data/doc/classes/LongDecimal.src/M000082.html +3 -8
- data/doc/classes/LongDecimal.src/M000083.html +9 -5
- data/doc/classes/LongDecimal.src/M000084.html +7 -7
- data/doc/classes/LongDecimal.src/M000085.html +5 -4
- data/doc/classes/LongDecimal.src/M000086.html +9 -4
- data/doc/classes/LongDecimal.src/M000087.html +4 -4
- data/doc/classes/LongDecimal.src/M000088.html +4 -4
- data/doc/classes/LongDecimal.src/M000089.html +4 -59
- data/doc/classes/LongDecimal.src/M000090.html +4 -4
- data/doc/classes/LongDecimal.src/M000091.html +59 -4
- data/doc/classes/LongDecimal.src/M000092.html +18 -0
- data/doc/classes/LongDecimal.src/M000093.html +18 -0
- data/doc/classes/LongDecimal.src/M000096.html +5 -4
- data/doc/classes/LongDecimal.src/M000097.html +5 -4
- data/doc/classes/LongDecimal.src/M000098.html +4 -4
- data/doc/classes/LongDecimal.src/M000099.html +4 -4
- data/doc/classes/LongDecimal.src/M000100.html +18 -0
- data/doc/classes/LongDecimal.src/M000101.html +18 -0
- data/doc/classes/LongDecimalBase.html +53 -53
- data/doc/classes/LongDecimalBase.src/M000104.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000105.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000106.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000107.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000108.html +18 -0
- data/doc/classes/LongDecimalBase.src/M000109.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000112.html +9 -4
- data/doc/classes/LongDecimalBase.src/M000113.html +19 -0
- data/doc/classes/LongDecimalBase.src/M000114.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000004.html +22 -5
- data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +10 -10
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000141.html +22 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000142.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000146.html +22 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000147.html +18 -0
- data/doc/classes/LongMath.html +191 -137
- data/doc/classes/LongMath.src/M000115.html +5 -4
- data/doc/classes/LongMath.src/M000116.html +4 -5
- data/doc/classes/LongMath.src/M000117.html +4 -4
- data/doc/classes/LongMath.src/M000118.html +5 -18
- data/doc/classes/LongMath.src/M000119.html +4 -18
- data/doc/classes/LongMath.src/M000120.html +18 -5
- data/doc/classes/LongMath.src/M000121.html +16 -27
- data/doc/classes/LongMath.src/M000122.html +4 -4
- data/doc/classes/LongMath.src/M000123.html +17 -44
- data/doc/classes/LongMath.src/M000124.html +5 -21
- data/doc/classes/LongMath.src/M000125.html +49 -29
- data/doc/classes/LongMath.src/M000126.html +20 -47
- data/doc/classes/LongMath.src/M000127.html +36 -8
- data/doc/classes/LongMath.src/M000128.html +6 -4
- data/doc/classes/LongMath.src/M000129.html +33 -4
- data/doc/classes/LongMath.src/M000130.html +40 -56
- data/doc/classes/LongMath.src/M000131.html +8 -43
- data/doc/classes/LongMath.src/M000132.html +4 -10
- data/doc/classes/LongMath.src/M000133.html +4 -7
- data/doc/classes/LongMath.src/M000134.html +58 -15
- data/doc/classes/LongMath.src/M000135.html +39 -16
- data/doc/classes/LongMath.src/M000136.html +6 -39
- data/doc/classes/LongMath.src/M000137.html +5 -168
- data/doc/classes/LongMath.src/M000138.html +34 -0
- data/doc/classes/LongMath.src/M000139.html +34 -0
- data/doc/classes/LongMath.src/M000140.html +57 -0
- data/doc/classes/LongMath.src/M000141.html +219 -0
- data/doc/classes/LongMath.src/M000142.html +33 -0
- data/doc/classes/LongMath.src/M000143.html +70 -0
- data/doc/classes/LongMath.src/M000144.html +58 -0
- data/doc/classes/LongMath/CacheKey.html +164 -0
- data/doc/classes/LongMath/CacheKey.src/M000140.html +36 -0
- data/doc/classes/LongMath/CacheKey.src/M000145.html +36 -0
- data/doc/classes/Numeric.html +5 -5
- data/doc/classes/Numeric.src/M000102.html +23 -0
- data/doc/classes/Rational.html +5 -5
- data/doc/classes/Rational.src/M000103.html +23 -0
- data/doc/created.rid +1 -1
- data/doc/files/lib/long-decimal_rb.html +2 -2
- data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
- data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
- data/doc/fr_method_index.html +106 -101
- data/lib/long-decimal.rb +203 -85
- data/test/testlongdecimal.rb +372 -69
- metadata +28 -2
data/doc/classes/Rational.html
CHANGED
@@ -101,7 +101,7 @@
|
|
101
101
|
<h3 class="section-bar">Methods</h3>
|
102
102
|
|
103
103
|
<div class="name-list">
|
104
|
-
<a href="#
|
104
|
+
<a href="#M000103">to_ld</a>
|
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-
|
127
|
-
<a name="
|
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/
|
131
|
-
onclick="popupCode('Rational.src/
|
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
|
-
|
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>
|
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.
|
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
|
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">&&</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
|
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>
|
data/doc/fr_method_index.html
CHANGED
@@ -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#
|
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#
|
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#
|
28
|
-
<a href="classes/LongDecimal.html#
|
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#
|
32
|
-
<a href="classes/LongDecimalBase.html#
|
33
|
-
<a href="classes/LongDecimal.html#
|
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#
|
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#
|
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#
|
40
|
-
<a href="classes/LongMath/CacheKey.html#
|
41
|
-
<a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#
|
42
|
-
<a href="classes/LongDecimalBase.html#
|
43
|
-
<a href="classes/LongDecimal.html#
|
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#
|
46
|
-
<a href="classes/LongDecimal.html#
|
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#
|
50
|
-
<a href="classes/LongDecimal.html#
|
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#
|
53
|
-
<a href="classes/LongDecimalBase.html#
|
54
|
-
<a href="classes/LongDecimal.html#
|
55
|
-
<a href="classes/LongMath.html#
|
56
|
-
<a href="classes/LongMath.html#
|
57
|
-
<a href="classes/LongMath.html#M000117">
|
58
|
-
<a href="classes/LongMath.html#
|
59
|
-
<a href="classes/LongMath.html#
|
60
|
-
<a href="classes/
|
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#
|
63
|
-
<a href="classes/LongDecimal.html#
|
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#
|
67
|
-
<a href="classes/LongDecimal.html#
|
68
|
-
<a href="classes/LongDecimal.html#
|
69
|
-
<a href="classes/LongDecimal.html#
|
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#
|
72
|
-
<a href="classes/LongMath.html#
|
73
|
-
<a href="classes/LongMath.html#
|
74
|
-
<a href="classes/LongMath.html#
|
75
|
-
<a href="classes/LongMath.html#
|
76
|
-
<a href="classes/LongMath.html#
|
77
|
-
<a href="classes/LongMath.html#
|
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/
|
81
|
-
<a href="classes/
|
82
|
-
<a href="classes/
|
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#
|
86
|
-
<a href="classes/LongDecimal.html#
|
87
|
-
<a href="classes/
|
88
|
-
<a href="classes/
|
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#
|
91
|
-
<a href="classes/LongMath.html#
|
92
|
-
<a href="classes/LongMath.html#
|
93
|
-
<a href="classes/LongMath.html#
|
94
|
-
<a href="classes/LongMath.html#
|
95
|
-
<a href="classes/LongMath.html#
|
96
|
-
<a href="classes/LongMath.html#
|
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#
|
99
|
-
<a href="classes/LongDecimal.html#
|
100
|
-
<a href="classes/LongDecimal.html#
|
101
|
-
<a href="classes/LongDecimal.html#
|
102
|
-
<a href="classes/LongMath.html#
|
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/
|
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#
|
112
|
-
<a href="classes/LongMath.html#
|
113
|
-
<a href="classes/LongMath.html#
|
114
|
-
<a href="classes/LongMath.html#
|
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#
|
117
|
-
<a href="classes/LongDecimal.html#
|
118
|
-
<a href="classes/LongDecimalBase.html#
|
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#
|
123
|
-
<a href="classes/LongDecimalBase.html#
|
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#
|
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#
|
130
|
-
<a href="classes/LongDecimal.html#
|
131
|
-
<a href="classes/LongMath.html#
|
132
|
-
<a href="classes/LongMath.html#
|
133
|
-
<a href="classes/LongDecimal.html#
|
134
|
-
<a href="classes/LongDecimal.html#
|
135
|
-
<a href="classes/LongMath.html#
|
136
|
-
<a href="classes/LongMath.html#
|
137
|
-
<a href="classes/LongMath.html#
|
138
|
-
<a href="classes/LongMath.html#
|
139
|
-
<a href="classes/LongDecimal.html#
|
140
|
-
<a href="classes/LongDecimalBase.html#
|
141
|
-
<a href="classes/LongDecimal.html#
|
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/
|
150
|
-
<a href="classes/
|
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/
|
153
|
-
<a href="classes/LongDecimalBase.html#
|
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">
|
157
|
-
<a href="classes/LongDecimal.html#M000046">
|
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#
|
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#
|
164
|
-
<a href="classes/LongDecimal.html#M000076"
|
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.
|
5
|
-
# CVS-Label: $Name:
|
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.
|
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.
|
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
|
277
|
-
mul_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
|
-
|
346
|
-
@
|
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
|
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
|
-
|
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.
|
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
|
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
|
-
|
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
|
1238
|
-
@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
|
-
|
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
|
-
|
1828
|
-
|
1829
|
-
|
1830
|
-
|
1831
|
-
|
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
|
-
|
2340
|
-
|
2341
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
#
|
2592
|
-
|
2593
|
-
|
2594
|
-
|
2595
|
-
|
2596
|
-
|
2597
|
-
|
2598
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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
|