long-decimal 0.01.00 → 0.01.01
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +6 -3
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.html +207 -189
- data/doc/classes/LongDecimal.src/M000036.html +1 -1
- data/doc/classes/LongDecimal.src/M000037.html +1 -1
- data/doc/classes/LongDecimal.src/M000038.html +1 -1
- data/doc/classes/LongDecimal.src/M000039.html +1 -1
- data/doc/classes/LongDecimal.src/M000040.html +1 -1
- data/doc/classes/LongDecimal.src/M000041.html +1 -1
- data/doc/classes/LongDecimal.src/M000042.html +1 -1
- data/doc/classes/LongDecimal.src/M000043.html +1 -1
- data/doc/classes/LongDecimal.src/M000044.html +1 -1
- data/doc/classes/LongDecimal.src/M000045.html +1 -1
- data/doc/classes/LongDecimal.src/M000046.html +1 -1
- data/doc/classes/LongDecimal.src/M000047.html +1 -1
- data/doc/classes/LongDecimal.src/M000048.html +1 -1
- data/doc/classes/LongDecimal.src/M000049.html +1 -1
- data/doc/classes/LongDecimal.src/M000050.html +15 -2
- data/doc/classes/LongDecimal.src/M000051.html +1 -1
- data/doc/classes/LongDecimal.src/M000052.html +2 -2
- data/doc/classes/LongDecimal.src/M000053.html +1 -1
- data/doc/classes/LongDecimal.src/M000054.html +1 -1
- data/doc/classes/LongDecimal.src/M000055.html +1 -1
- data/doc/classes/LongDecimal.src/M000056.html +1 -1
- data/doc/classes/LongDecimal.src/M000057.html +1 -1
- data/doc/classes/LongDecimal.src/M000058.html +1 -1
- data/doc/classes/LongDecimal.src/M000059.html +1 -1
- data/doc/classes/LongDecimal.src/M000060.html +1 -1
- data/doc/classes/LongDecimal.src/M000062.html +1 -1
- data/doc/classes/LongDecimal.src/M000063.html +1 -1
- data/doc/classes/LongDecimal.src/M000064.html +1 -1
- data/doc/classes/LongDecimal.src/M000065.html +1 -1
- data/doc/classes/LongDecimal.src/M000066.html +4 -8
- data/doc/classes/LongDecimal.src/M000067.html +6 -7
- data/doc/classes/LongDecimal.src/M000068.html +5 -5
- data/doc/classes/LongDecimal.src/M000069.html +6 -6
- data/doc/classes/LongDecimal.src/M000070.html +9 -4
- data/doc/classes/LongDecimal.src/M000071.html +4 -19
- data/doc/classes/LongDecimal.src/M000072.html +15 -5
- data/doc/classes/LongDecimal.src/M000073.html +7 -7
- data/doc/classes/LongDecimal.src/M000074.html +7 -18
- data/doc/classes/LongDecimal.src/M000075.html +20 -7
- data/doc/classes/LongDecimal.src/M000076.html +8 -5
- data/doc/classes/LongDecimal.src/M000077.html +5 -9
- data/doc/classes/LongDecimal.src/M000078.html +5 -5
- data/doc/classes/LongDecimal.src/M000079.html +5 -5
- data/doc/classes/LongDecimal.src/M000080.html +9 -4
- data/doc/classes/LongDecimal.src/M000081.html +4 -7
- data/doc/classes/LongDecimal.src/M000082.html +4 -4
- data/doc/classes/LongDecimal.src/M000083.html +7 -4
- data/doc/classes/LongDecimal.src/M000084.html +4 -4
- data/doc/classes/LongDecimal.src/M000085.html +4 -9
- data/doc/classes/LongDecimal.src/M000086.html +6 -6
- data/doc/classes/LongDecimal.src/M000087.html +9 -5
- data/doc/classes/LongDecimal.src/M000088.html +4 -8
- data/doc/classes/LongDecimal.src/M000089.html +9 -4
- data/doc/classes/LongDecimal.src/M000090.html +4 -4
- data/doc/classes/LongDecimal.src/M000091.html +4 -4
- data/doc/classes/LongDecimal.src/M000092.html +4 -4
- data/doc/classes/LongDecimal.src/M000093.html +4 -59
- data/doc/classes/LongDecimal.src/M000094.html +59 -4
- data/doc/classes/LongDecimal.src/M000095.html +4 -4
- data/doc/classes/LongDecimal.src/M000096.html +4 -5
- data/doc/classes/LongDecimal.src/M000099.html +5 -5
- data/doc/classes/LongDecimal.src/M000100.html +5 -4
- data/doc/classes/LongDecimal.src/M000101.html +4 -4
- data/doc/classes/LongDecimal.src/M000102.html +4 -4
- data/doc/classes/LongDecimal.src/M000103.html +4 -4
- data/doc/classes/LongDecimalBase.html +53 -53
- data/doc/classes/LongDecimalBase.src/M000108.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000109.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000110.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000111.html +4 -4
- data/doc/classes/LongDecimalBase.src/M000112.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000113.html +9 -9
- data/doc/classes/LongDecimalBase.src/M000116.html +9 -5
- data/doc/classes/LongDecimalBase.src/M000117.html +5 -4
- data/doc/classes/LongDecimalQuot.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
- 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 +2 -2
- 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/M000030.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000031.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000034.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000035.html +1 -1
- data/doc/classes/LongDecimalRoundingMode.html +6 -1
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +37 -16
- data/doc/classes/LongMath.html +246 -161
- data/doc/classes/LongMath.src/M000119.html +5 -4
- data/doc/classes/LongMath.src/M000120.html +4 -4
- data/doc/classes/LongMath.src/M000121.html +4 -5
- data/doc/classes/LongMath.src/M000122.html +5 -4
- data/doc/classes/LongMath.src/M000123.html +4 -18
- data/doc/classes/LongMath.src/M000124.html +14 -14
- data/doc/classes/LongMath.src/M000125.html +18 -5
- data/doc/classes/LongMath.src/M000126.html +5 -29
- data/doc/classes/LongMath.src/M000127.html +29 -5
- data/doc/classes/LongMath.src/M000128.html +5 -57
- data/doc/classes/LongMath.src/M000129.html +55 -19
- data/doc/classes/LongMath.src/M000130.html +20 -35
- data/doc/classes/LongMath.src/M000131.html +36 -6
- data/doc/classes/LongMath.src/M000132.html +6 -33
- data/doc/classes/LongMath.src/M000133.html +26 -44
- data/doc/classes/LongMath.src/M000134.html +49 -5
- data/doc/classes/LongMath.src/M000135.html +7 -4
- data/doc/classes/LongMath.src/M000136.html +4 -4
- data/doc/classes/LongMath.src/M000137.html +4 -72
- data/doc/classes/LongMath.src/M000138.html +67 -39
- data/doc/classes/LongMath.src/M000139.html +44 -4
- data/doc/classes/LongMath.src/M000140.html +4 -4
- data/doc/classes/LongMath.src/M000141.html +4 -6
- data/doc/classes/LongMath.src/M000142.html +4 -18
- data/doc/classes/LongMath.src/M000143.html +8 -7
- data/doc/classes/LongMath.src/M000144.html +10 -35
- data/doc/classes/LongMath.src/M000145.html +23 -202
- data/doc/classes/LongMath.src/M000146.html +322 -4
- data/doc/classes/LongMath.src/M000147.html +22 -63
- data/doc/classes/LongMath.src/M000148.html +65 -33
- data/doc/classes/LongMath/CacheKey.html +5 -5
- data/doc/classes/Numeric.html +11 -11
- data/doc/classes/Numeric.src/M000105.html +9 -4
- data/doc/classes/Rational.html +6 -6
- 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 +102 -95
- data/lib/long-decimal.rb +206 -49
- data/test/testlongdecimal.rb +736 -21
- data/test/testlongdeclib.rb +136 -25
- data/test/testrandlib.rb +87 -0
- data/test/testrandom.rb +30 -45
- data/test/testrandpower.rb +72 -0
- metadata +4 -2
|
@@ -5,14 +5,54 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>exp_raw (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
15
|
-
<span class="ruby-
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2529</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">exp_raw</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">j</span>, <span class="ruby-identifier">k</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
15
|
+
<span class="ruby-comment cmt"># dprec = [ (iprec*0.9).round , (prec + 1) << 1 ].min</span>
|
|
16
|
+
<span class="ruby-identifier">dprec</span> = [ (<span class="ruby-identifier">iprec</span><span class="ruby-operator">*</span><span class="ruby-value">0</span><span class="ruby-value">.9</span>).<span class="ruby-identifier">round</span>, <span class="ruby-identifier">prec</span> ].<span class="ruby-identifier">max</span>
|
|
17
|
+
<span class="ruby-comment cmt"># puts("prec=#{prec} dprec=#{dprec} iprec=#{iprec}")</span>
|
|
18
|
+
|
|
19
|
+
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>)
|
|
20
|
+
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
21
|
+
<span class="ruby-keyword kw">end</span>
|
|
22
|
+
|
|
23
|
+
<span class="ruby-identifier">x_k</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> (<span class="ruby-value">1</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">k</span>)).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
24
|
+
<span class="ruby-identifier">x_j</span> = (<span class="ruby-identifier">x_k</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">j</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
25
|
+
<span class="ruby-identifier">s</span> = [ <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">0</span>) ] <span class="ruby-operator">*</span> <span class="ruby-identifier">j</span>
|
|
26
|
+
<span class="ruby-identifier">t</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>)
|
|
27
|
+
<span class="ruby-identifier">last_t</span> = <span class="ruby-value">1</span>
|
|
28
|
+
<span class="ruby-identifier">f</span> = <span class="ruby-value">0</span>
|
|
29
|
+
<span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
|
|
30
|
+
<span class="ruby-identifier">j</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
|
31
|
+
<span class="ruby-identifier">s</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">t</span>
|
|
32
|
+
<span class="ruby-identifier">f</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
|
|
33
|
+
<span class="ruby-identifier">t</span> = (<span class="ruby-identifier">t</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">f</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
34
|
+
<span class="ruby-keyword kw">end</span>
|
|
35
|
+
<span class="ruby-identifier">t</span> = (<span class="ruby-identifier">t</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">x_j</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
36
|
+
<span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">t</span>.<span class="ruby-identifier">zero?</span>)
|
|
37
|
+
<span class="ruby-identifier">tr</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">dprec</span>, <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_DOWN</span>).<span class="ruby-identifier">abs</span>
|
|
38
|
+
<span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">t</span>.<span class="ruby-identifier">zero?</span>)
|
|
39
|
+
<span class="ruby-identifier">tu</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">unit</span>
|
|
40
|
+
<span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">tr</span> <span class="ruby-operator"><=</span> <span class="ruby-identifier">tu</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">last_t</span> <span class="ruby-operator"><=</span> <span class="ruby-identifier">tu</span>)
|
|
41
|
+
<span class="ruby-identifier">last_t</span> = <span class="ruby-identifier">tr</span>
|
|
42
|
+
<span class="ruby-keyword kw">end</span>
|
|
43
|
+
<span class="ruby-identifier">x_i</span> = <span class="ruby-value">1</span>
|
|
44
|
+
<span class="ruby-identifier">y_k</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">0</span>)
|
|
45
|
+
<span class="ruby-identifier">j</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
|
46
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">i</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
|
|
47
|
+
<span class="ruby-identifier">x_i</span> = (<span class="ruby-identifier">x_i</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">x_k</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
48
|
+
<span class="ruby-keyword kw">end</span>
|
|
49
|
+
<span class="ruby-identifier">y_k</span> <span class="ruby-operator">+=</span> (<span class="ruby-identifier">s</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">*</span> <span class="ruby-identifier">x_i</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
50
|
+
<span class="ruby-keyword kw">end</span>
|
|
51
|
+
<span class="ruby-identifier">k</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
|
52
|
+
<span class="ruby-identifier">y_k</span> = <span class="ruby-identifier">y_k</span>.<span class="ruby-identifier">square</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
53
|
+
<span class="ruby-keyword kw">end</span>
|
|
54
|
+
|
|
55
|
+
<span class="ruby-identifier">y_k</span>
|
|
16
56
|
<span class="ruby-keyword kw">end</span></pre>
|
|
17
57
|
</body>
|
|
18
58
|
</html>
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>sqrt (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
15
|
-
<span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2576</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>) <span class="ruby-comment cmt"># down</span>
|
|
15
|
+
<span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>, <span class="ruby-keyword kw">false</span>)
|
|
16
16
|
<span class="ruby-keyword kw">end</span></pre>
|
|
17
17
|
</body>
|
|
18
18
|
</html>
|
|
@@ -5,16 +5,14 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>sqrt_with_remainder (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
15
|
-
<span class="ruby-identifier">
|
|
16
|
-
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
17
|
-
<span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2583</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt_with_remainder</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>)
|
|
15
|
+
<span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-constant">ROUND_DOWN</span>, <span class="ruby-keyword kw">true</span>)
|
|
18
16
|
<span class="ruby-keyword kw">end</span></pre>
|
|
19
17
|
</body>
|
|
20
18
|
</html>
|
|
@@ -5,30 +5,16 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>log (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
15
|
-
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2644</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>) <span class="ruby-comment cmt"># down?</span>
|
|
16
15
|
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">"prec"</span>)
|
|
17
16
|
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
18
|
-
<span class="ruby-identifier">
|
|
19
|
-
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>)
|
|
20
|
-
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
21
|
-
<span class="ruby-keyword kw">end</span>
|
|
22
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">one?</span>) <span class="ruby-keyword kw">then</span>
|
|
23
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
24
|
-
<span class="ruby-keyword kw">end</span>
|
|
25
|
-
|
|
26
|
-
<span class="ruby-identifier">id</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">int_digits10</span>
|
|
27
|
-
<span class="ruby-identifier">xx</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">move_point_left</span>(<span class="ruby-identifier">id</span>)
|
|
28
|
-
<span class="ruby-identifier">lnxx</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">xx</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
29
|
-
<span class="ruby-identifier">ln10</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-value">10</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
30
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">id</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">lnxx</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">ln10</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
31
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
|
|
17
|
+
<span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
32
18
|
<span class="ruby-keyword kw">end</span></pre>
|
|
33
19
|
</body>
|
|
34
20
|
</html>
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>log10 (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2654</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">log10</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>) <span class="ruby-comment cmt"># down?</span>
|
|
15
15
|
|
|
16
16
|
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">"prec"</span>)
|
|
17
17
|
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
@@ -22,11 +22,12 @@
|
|
|
22
22
|
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">one?</span>) <span class="ruby-keyword kw">then</span>
|
|
23
23
|
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
24
24
|
<span class="ruby-keyword kw">end</span>
|
|
25
|
-
|
|
26
|
-
<span class="ruby-identifier">
|
|
25
|
+
|
|
26
|
+
<span class="ruby-identifier">id</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">int_digits10</span>
|
|
27
|
+
<span class="ruby-identifier">xx</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">move_point_left</span>(<span class="ruby-identifier">id</span>)
|
|
27
28
|
<span class="ruby-identifier">lnxx</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">xx</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
28
|
-
<span class="ruby-identifier">
|
|
29
|
-
<span class="ruby-identifier">y</span>
|
|
29
|
+
<span class="ruby-identifier">ln10</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-value">10</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
30
|
+
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">id</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">lnxx</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">ln10</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
30
31
|
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
|
|
31
32
|
<span class="ruby-keyword kw">end</span></pre>
|
|
32
33
|
</body>
|
|
@@ -5,54 +5,29 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>log2 (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2678</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">log2</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>)
|
|
15
15
|
|
|
16
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"x=#{x.inspect} must not be positive"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
|
17
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">prec</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">then</span>
|
|
18
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
|
|
19
|
-
<span class="ruby-identifier">prec</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span>
|
|
20
|
-
<span class="ruby-keyword kw">else</span>
|
|
21
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">"precision must be supplied either as precision of x=#{x} or explicitely"</span>
|
|
22
|
-
<span class="ruby-keyword kw">end</span>
|
|
23
|
-
<span class="ruby-keyword kw">end</span>
|
|
24
16
|
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">"prec"</span>)
|
|
25
|
-
|
|
26
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">final_mode</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>)
|
|
27
|
-
<span class="ruby-identifier">final_mode</span> = <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>
|
|
28
|
-
<span class="ruby-keyword kw">end</span>
|
|
29
|
-
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">final_mode</span>, <span class="ruby-value str">"final_mode"</span>)
|
|
30
17
|
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
31
|
-
|
|
32
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">then</span>
|
|
33
|
-
<span class="ruby-comment cmt"># iprec = ((prec+10)*1.20).round</span>
|
|
34
|
-
<span class="ruby-identifier">iprec</span> = ((<span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-value">12</span>)<span class="ruby-operator">*</span><span class="ruby-value">1.20</span>).<span class="ruby-identifier">round</span>
|
|
35
|
-
<span class="ruby-keyword kw">end</span>
|
|
36
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">prec</span>) <span class="ruby-keyword kw">then</span>
|
|
37
|
-
<span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span>
|
|
38
|
-
<span class="ruby-keyword kw">end</span>
|
|
39
|
-
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-value str">"iprec"</span>)
|
|
18
|
+
<span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">6</span>
|
|
40
19
|
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>)
|
|
41
20
|
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
42
21
|
<span class="ruby-keyword kw">end</span>
|
|
43
22
|
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">one?</span>) <span class="ruby-keyword kw">then</span>
|
|
44
23
|
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
45
24
|
<span class="ruby-keyword kw">end</span>
|
|
46
|
-
|
|
47
|
-
<span class="ruby-identifier">
|
|
48
|
-
<span class="ruby-identifier">
|
|
49
|
-
<span class="ruby-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<span class="ruby-keyword kw">end</span>
|
|
53
|
-
|
|
54
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">final_mode</span>)
|
|
55
|
-
|
|
25
|
+
<span class="ruby-identifier">id</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">int_digits2</span>
|
|
26
|
+
<span class="ruby-identifier">xx</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> (<span class="ruby-value">1</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">id</span>)).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span><span class="ruby-operator">+</span><span class="ruby-identifier">id</span>)
|
|
27
|
+
<span class="ruby-identifier">lnxx</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">xx</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
28
|
+
<span class="ruby-identifier">ln2</span> = <span class="ruby-identifier">log_internal</span>(<span class="ruby-value">2</span>.<span class="ruby-identifier">to_ld</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
29
|
+
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">id</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">lnxx</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">ln2</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
30
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
|
|
56
31
|
<span class="ruby-keyword kw">end</span></pre>
|
|
57
32
|
</body>
|
|
58
33
|
</html>
|
|
@@ -5,193 +5,18 @@
|
|
|
5
5
|
|
|
6
6
|
<html>
|
|
7
7
|
<head>
|
|
8
|
-
<title>
|
|
8
|
+
<title>log_internal (LongMath)</title>
|
|
9
9
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
|
10
10
|
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
|
11
11
|
</head>
|
|
12
12
|
<body class="standalone-code">
|
|
13
|
-
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line
|
|
14
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">
|
|
15
|
-
|
|
16
|
-
<span class="ruby-comment cmt"># t0 = Time.new</span>
|
|
17
|
-
<span class="ruby-comment cmt"># puts("log_raw start")</span>
|
|
18
|
-
|
|
19
|
-
<span class="ruby-comment cmt"># we have to rely on iprec being at least 10</span>
|
|
20
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"iprec=#{iprec} out of range"</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">iprec</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Fixnum</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">iprec</span> <span class="ruby-operator">>=</span> <span class="ruby-value">10</span>
|
|
21
|
-
|
|
22
|
-
<span class="ruby-comment cmt"># dprec = [ iprec - 1, (prec + 1) << 1 ].min</span>
|
|
23
|
-
<span class="ruby-comment cmt"># dprec >= 9</span>
|
|
24
|
-
<span class="ruby-identifier">dprec</span> = <span class="ruby-identifier">iprec</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
|
|
25
|
-
|
|
26
|
-
<span class="ruby-comment cmt"># result is stored in y</span>
|
|
27
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-value">0</span>
|
|
28
|
-
<span class="ruby-comment cmt"># sign of result</span>
|
|
29
|
-
<span class="ruby-identifier">s</span> = <span class="ruby-value">1</span>
|
|
30
|
-
<span class="ruby-comment cmt"># make sure x is >= 1</span>
|
|
31
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator"><</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">then</span>
|
|
32
|
-
<span class="ruby-identifier">x</span> = (<span class="ruby-value">1</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">x</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
33
|
-
<span class="ruby-identifier">s</span> = <span class="ruby-value">-1</span>
|
|
34
|
-
<span class="ruby-keyword kw">end</span>
|
|
35
|
-
<span class="ruby-comment cmt"># puts("log_raw prepared t=#{Time.new-t0}")</span>
|
|
36
|
-
|
|
37
|
-
<span class="ruby-comment cmt"># number that are beyond the usual range of Float need to be</span>
|
|
38
|
-
<span class="ruby-comment cmt"># handled specially to reduce to something expressable as Float</span>
|
|
39
|
-
<span class="ruby-identifier">exp_keys</span> = [ <span class="ruby-constant">MAX_EXP_ABLE</span>.<span class="ruby-identifier">to_i</span>, <span class="ruby-value">100</span>, <span class="ruby-value">10</span>, <span class="ruby-value">1</span> ]
|
|
40
|
-
<span class="ruby-identifier">exp_keys</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">exp_key</span><span class="ruby-operator">|</span>
|
|
41
|
-
<span class="ruby-identifier">exp_val</span> = <span class="ruby-identifier">exp</span>(<span class="ruby-identifier">exp_key</span>, <span class="ruby-identifier">iprec</span>)
|
|
42
|
-
<span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">></span> <span class="ruby-identifier">exp_val</span>) <span class="ruby-keyword kw">do</span>
|
|
43
|
-
<span class="ruby-identifier">x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">exp_val</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
44
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">s</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
|
|
45
|
-
<span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">exp_key</span>
|
|
46
|
-
<span class="ruby-keyword kw">else</span>
|
|
47
|
-
<span class="ruby-identifier">y</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">exp_key</span>
|
|
48
|
-
<span class="ruby-keyword kw">end</span>
|
|
49
|
-
<span class="ruby-keyword kw">end</span>
|
|
50
|
-
<span class="ruby-keyword kw">end</span>
|
|
51
|
-
|
|
52
|
-
<span class="ruby-identifier">factor</span> = <span class="ruby-value">1</span>
|
|
53
|
-
<span class="ruby-identifier">sprec</span> = (<span class="ruby-identifier">iprec</span> <span class="ruby-operator">*</span> <span class="ruby-value">1.5</span>).<span class="ruby-identifier">round</span>
|
|
54
|
-
<span class="ruby-comment cmt"># delta = LongDecimal(1, (iprec.to_f**(1/3)).round)</span>
|
|
55
|
-
<span class="ruby-comment cmt"># delta = LongDecimal(1, (iprec.to_f**0.3).round)</span>
|
|
56
|
-
<span class="ruby-identifier">delta</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>, (<span class="ruby-identifier">iprec</span>.<span class="ruby-identifier">to_f</span><span class="ruby-operator">**</span><span class="ruby-value">0</span><span class="ruby-value">.45</span>).<span class="ruby-identifier">round</span>)
|
|
57
|
-
<span class="ruby-comment cmt"># delta = LongDecimal(1, LongMath.sqrtw(iprec))</span>
|
|
58
|
-
<span class="ruby-comment cmt"># delta = LongDecimal(1, LongMath.sqrtw(LongMath.sqrtw(iprec+1)+1))</span>
|
|
59
|
-
<span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>).<span class="ruby-identifier">abs</span> <span class="ruby-operator">></span> <span class="ruby-identifier">delta</span> <span class="ruby-keyword kw">do</span>
|
|
60
|
-
<span class="ruby-identifier">x</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">sqrt</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">sprec</span>, <span class="ruby-identifier">mode</span>)
|
|
61
|
-
<span class="ruby-identifier">factor</span> <span class="ruby-operator">*=</span> <span class="ruby-value">2</span>
|
|
62
|
-
<span class="ruby-keyword kw">end</span>
|
|
63
|
-
|
|
64
|
-
<span class="ruby-identifier">sum</span> = <span class="ruby-value">0</span>
|
|
65
|
-
<span class="ruby-identifier">z</span> = <span class="ruby-value">1</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">x</span>
|
|
66
|
-
<span class="ruby-identifier">i</span> = <span class="ruby-value">1</span>
|
|
67
|
-
<span class="ruby-identifier">p</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
|
|
68
|
-
<span class="ruby-identifier">d</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
|
|
69
|
-
<span class="ruby-keyword kw">until</span> <span class="ruby-identifier">p</span>.<span class="ruby-identifier">abs</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">dprec</span>, <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_DOWN</span>).<span class="ruby-identifier">zero?</span> <span class="ruby-keyword kw">do</span>
|
|
70
|
-
<span class="ruby-identifier">p</span> = (<span class="ruby-identifier">p</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">z</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
71
|
-
<span class="ruby-identifier">d</span> = (<span class="ruby-identifier">p</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">i</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
72
|
-
<span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
|
|
73
|
-
<span class="ruby-identifier">sum</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">d</span>
|
|
74
|
-
|
|
75
|
-
<span class="ruby-keyword kw">end</span>
|
|
76
|
-
|
|
77
|
-
<span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> ((<span class="ruby-identifier">s</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">factor</span>) <span class="ruby-operator">*</span> <span class="ruby-identifier">sum</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
78
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
|
|
79
|
-
<span class="ruby-keyword kw">end</span>
|
|
80
|
-
|
|
81
|
-
<span class="ruby-identifier">private</span>
|
|
82
|
-
|
|
83
|
-
<span class="ruby-comment cmt">#</span>
|
|
84
|
-
<span class="ruby-comment cmt"># internal helper method for calculating the internal precision for power</span>
|
|
85
|
-
<span class="ruby-comment cmt">#</span>
|
|
86
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">calc_iprec_for_power</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y</span>, <span class="ruby-identifier">prec</span>)
|
|
87
|
-
<span class="ruby-identifier">x_f</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>
|
|
88
|
-
<span class="ruby-identifier">y_f</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_f</span>
|
|
89
|
-
<span class="ruby-identifier">logx_f</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">x_f</span>.<span class="ruby-identifier">abs</span>)
|
|
90
|
-
<span class="ruby-identifier">logy_f</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">y_f</span>.<span class="ruby-identifier">abs</span>)
|
|
91
|
-
<span class="ruby-identifier">logx_y_f</span> = <span class="ruby-identifier">logx_f</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">y_f</span>
|
|
92
|
-
<span class="ruby-identifier">iprec_x</span> = <span class="ruby-identifier">calc_iprec_for_exp</span>(<span class="ruby-identifier">logx_y_f</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">logx_y_f</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>)
|
|
93
|
-
<span class="ruby-comment cmt"># iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0) + 10</span>
|
|
94
|
-
<span class="ruby-identifier">iprec_y</span> = <span class="ruby-identifier">iprec_x</span>
|
|
95
|
-
<span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">iprec_x</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>
|
|
96
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">logx_f</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>)
|
|
97
|
-
<span class="ruby-identifier">iprec_x</span> <span class="ruby-operator">-=</span> (<span class="ruby-identifier">logx_f</span><span class="ruby-operator">/</span><span class="ruby-constant">LOG10</span>).<span class="ruby-identifier">round</span>
|
|
98
|
-
<span class="ruby-keyword kw">end</span>
|
|
99
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">logy_f</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>)
|
|
100
|
-
<span class="ruby-identifier">iprec_y</span> <span class="ruby-operator">-=</span> (<span class="ruby-identifier">logy_f</span><span class="ruby-operator">/</span><span class="ruby-constant">LOG10</span>).<span class="ruby-identifier">round</span>
|
|
101
|
-
<span class="ruby-keyword kw">end</span>
|
|
102
|
-
[ <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">iprec_x</span>, <span class="ruby-identifier">iprec_y</span> ]
|
|
103
|
-
|
|
104
|
-
<span class="ruby-keyword kw">end</span>
|
|
105
|
-
|
|
106
|
-
<span class="ruby-identifier">public</span>
|
|
107
|
-
|
|
108
|
-
<span class="ruby-comment cmt">#</span>
|
|
109
|
-
<span class="ruby-comment cmt"># calc the power of x with exponent y to the given precision as</span>
|
|
110
|
-
<span class="ruby-comment cmt"># LongDecimal. Only supports values of y such that exp(y) still</span>
|
|
111
|
-
<span class="ruby-comment cmt"># fits into a float (y <= 709)</span>
|
|
112
|
-
<span class="ruby-comment cmt">#</span>
|
|
113
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">power</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
|
|
114
|
-
|
|
115
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"x=#{x} must be numeric"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Numeric</span>
|
|
116
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"y=#{y} must be numeric"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Numeric</span>
|
|
117
|
-
<span class="ruby-comment cmt"># raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE</span>
|
|
118
|
-
<span class="ruby-comment cmt"># raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x <= MAX_FLOATABLE</span>
|
|
119
|
-
<span class="ruby-comment cmt"># raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?</span>
|
|
120
|
-
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"x=#{x.inspect} must not negative"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">>=</span> <span class="ruby-value">0</span>
|
|
121
|
-
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">"prec"</span>)
|
|
122
|
-
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
123
|
-
|
|
124
|
-
<span class="ruby-comment cmt"># handle the special cases where base or exponent are 0 or 1 explicitely</span>
|
|
125
|
-
<span class="ruby-keyword kw">if</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">zero?</span> <span class="ruby-keyword kw">then</span>
|
|
126
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">one!</span>(<span class="ruby-identifier">prec</span>)
|
|
127
|
-
<span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">zero?</span> <span class="ruby-keyword kw">then</span>
|
|
128
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
129
|
-
<span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">one?</span> <span class="ruby-keyword kw">then</span>
|
|
130
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
131
|
-
<span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">one?</span> <span class="ruby-keyword kw">then</span>
|
|
132
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">one!</span>(<span class="ruby-identifier">prec</span>)
|
|
133
|
-
<span class="ruby-keyword kw">end</span>
|
|
134
|
-
|
|
135
|
-
<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">iprec_x</span>, <span class="ruby-identifier">iprec_y</span> = <span class="ruby-identifier">calc_iprec_for_power</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y</span>, <span class="ruby-identifier">prec</span>)
|
|
136
|
-
|
|
137
|
-
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>) <span class="ruby-operator">||</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>)
|
|
138
|
-
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_x</span>, <span class="ruby-identifier">mode</span>)
|
|
139
|
-
<span class="ruby-keyword kw">end</span>
|
|
140
|
-
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>) <span class="ruby-operator">||</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>)
|
|
141
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_y</span>, <span class="ruby-identifier">mode</span>)
|
|
142
|
-
<span class="ruby-keyword kw">end</span>
|
|
143
|
-
|
|
144
|
-
<span class="ruby-comment cmt"># try shortcut if exponent is an integer</span>
|
|
145
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">is_int?</span>
|
|
146
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_i</span>
|
|
147
|
-
<span class="ruby-keyword kw">end</span>
|
|
148
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>)
|
|
149
|
-
<span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>
|
|
150
|
-
<span class="ruby-comment cmt"># x = x.to_ld(prec)</span>
|
|
151
|
-
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_x</span>)
|
|
152
|
-
<span class="ruby-keyword kw">end</span>
|
|
153
|
-
<span class="ruby-identifier">z</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y</span>
|
|
154
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">z</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
155
|
-
<span class="ruby-keyword kw">end</span>
|
|
156
|
-
|
|
157
|
-
<span class="ruby-comment cmt"># it can be assumed that the exponent is not an integer, so it should</span>
|
|
158
|
-
<span class="ruby-comment cmt"># be converted into LongDecimal</span>
|
|
159
|
-
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>)
|
|
160
|
-
<span class="ruby-comment cmt"># y = y.to_ld(prec, mode)</span>
|
|
161
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_y</span>, <span class="ruby-identifier">mode</span>)
|
|
162
|
-
<span class="ruby-keyword kw">end</span>
|
|
163
|
-
|
|
164
|
-
<span class="ruby-comment cmt"># exponent is split in two parts, an integer part and a</span>
|
|
165
|
-
<span class="ruby-comment cmt"># LongDecimal with absolute value <= 0.5</span>
|
|
166
|
-
<span class="ruby-identifier">y0</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-value">0</span>, <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_UP</span>).<span class="ruby-identifier">to_i</span>
|
|
167
|
-
<span class="ruby-identifier">z0</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y0</span>
|
|
168
|
-
<span class="ruby-identifier">y1</span> = <span class="ruby-identifier">y</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">y0</span>
|
|
169
|
-
<span class="ruby-identifier">prec_extra</span> = <span class="ruby-value">0</span>
|
|
170
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y0</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>)
|
|
171
|
-
<span class="ruby-identifier">prec_extra</span> = (<span class="ruby-identifier">y0</span><span class="ruby-operator">*</span><span class="ruby-constant">Math</span>.<span class="ruby-identifier">log10</span>(<span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>).<span class="ruby-identifier">abs</span>).<span class="ruby-identifier">ceil</span>
|
|
172
|
-
<span class="ruby-keyword kw">end</span>
|
|
173
|
-
<span class="ruby-comment cmt"># z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)</span>
|
|
174
|
-
<span class="ruby-identifier">z1</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">power_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y1</span>, <span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-identifier">prec_extra</span> <span class="ruby-operator">+</span> <span class="ruby-value">3</span>, <span class="ruby-identifier">mode</span>)
|
|
175
|
-
<span class="ruby-identifier">z</span> = <span class="ruby-identifier">z0</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">z1</span>
|
|
176
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">z</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
|
|
177
|
-
<span class="ruby-keyword kw">end</span>
|
|
178
|
-
|
|
179
|
-
<span class="ruby-comment cmt">#</span>
|
|
180
|
-
<span class="ruby-comment cmt"># internal functionality of exp. exposes some more parameters, that</span>
|
|
181
|
-
<span class="ruby-comment cmt"># should usually be set to defaut values, in order to allow better testing.</span>
|
|
182
|
-
<span class="ruby-comment cmt"># do not actually call this method unless you are testing exp.</span>
|
|
183
|
-
<span class="ruby-comment cmt"># create a bug report, if the default settings for the parameters do</span>
|
|
184
|
-
<span class="ruby-comment cmt"># not work correctly</span>
|
|
185
|
-
<span class="ruby-comment cmt">#</span>
|
|
186
|
-
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">power_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">y</span>, <span class="ruby-identifier">prec</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">final_mode</span> = <span class="ruby-constant">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>, <span class="ruby-identifier">iprec</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_DOWN</span>)
|
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2704</span>
|
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">log_internal</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">final_mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>, <span class="ruby-identifier">iprec</span> = <span class="ruby-keyword kw">nil</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_imode</span>, <span class="ruby-identifier">cache_result</span> = <span class="ruby-keyword kw">true</span>)
|
|
187
15
|
|
|
16
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"x=#{x.inspect} must not be positive"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
|
188
17
|
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">prec</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">then</span>
|
|
189
|
-
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
|
|
190
|
-
<span class="ruby-identifier">prec</span> = [<span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span>, <span class="ruby-identifier">y</span>.<span class="ruby-identifier">scale</span>].<span class="ruby-identifier">max</span>
|
|
191
|
-
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
|
|
18
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
|
|
192
19
|
<span class="ruby-identifier">prec</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span>
|
|
193
|
-
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
|
|
194
|
-
<span class="ruby-identifier">prec</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">scale</span>
|
|
195
20
|
<span class="ruby-keyword kw">else</span>
|
|
196
21
|
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">"precision must be supplied either as precision of x=#{x} or explicitely"</span>
|
|
197
22
|
<span class="ruby-keyword kw">end</span>
|
|
@@ -199,39 +24,35 @@
|
|
|
199
24
|
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">"prec"</span>)
|
|
200
25
|
|
|
201
26
|
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">final_mode</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>)
|
|
202
|
-
<span class="ruby-identifier">final_mode</span> = <span class="ruby-constant">
|
|
27
|
+
<span class="ruby-identifier">final_mode</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">standard_mode</span>
|
|
203
28
|
<span class="ruby-keyword kw">end</span>
|
|
204
29
|
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">final_mode</span>, <span class="ruby-value str">"final_mode"</span>)
|
|
205
30
|
<span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">"mode"</span>)
|
|
206
31
|
|
|
207
|
-
<span class="ruby-keyword kw">if</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">zero?</span> <span class="ruby-keyword kw">then</span>
|
|
208
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">one!</span>(<span class="ruby-identifier">prec</span>)
|
|
209
|
-
<span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">zero?</span> <span class="ruby-keyword kw">then</span>
|
|
210
|
-
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
211
|
-
<span class="ruby-keyword kw">end</span>
|
|
212
|
-
|
|
213
32
|
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator">==</span> <span class="ruby-keyword kw">nil</span>) <span class="ruby-keyword kw">then</span>
|
|
214
|
-
<span class="ruby-
|
|
33
|
+
<span class="ruby-comment cmt"># iprec = ((prec+10)*1.20).round</span>
|
|
34
|
+
<span class="ruby-identifier">iprec</span> = ((<span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-value">12</span>)<span class="ruby-operator">*</span><span class="ruby-value">1.20</span>).<span class="ruby-identifier">round</span>
|
|
35
|
+
<span class="ruby-keyword kw">end</span>
|
|
36
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">prec</span>) <span class="ruby-keyword kw">then</span>
|
|
37
|
+
<span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span>
|
|
215
38
|
<span class="ruby-keyword kw">end</span>
|
|
39
|
+
<span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-value str">"iprec"</span>)
|
|
216
40
|
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>)
|
|
217
|
-
<span class="ruby-
|
|
218
|
-
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_x</span>, <span class="ruby-identifier">mode</span>)
|
|
41
|
+
<span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
219
42
|
<span class="ruby-keyword kw">end</span>
|
|
220
|
-
<span class="ruby-keyword kw">
|
|
221
|
-
<span class="ruby-
|
|
222
|
-
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec_y</span>, <span class="ruby-identifier">mode</span>)
|
|
43
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">one?</span>) <span class="ruby-keyword kw">then</span>
|
|
44
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">prec</span>)
|
|
223
45
|
<span class="ruby-keyword kw">end</span>
|
|
224
46
|
|
|
225
|
-
<span class="ruby-
|
|
226
|
-
<span class="ruby-identifier">
|
|
227
|
-
<span class="ruby-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
<span class="ruby-
|
|
231
|
-
<span class="ruby-identifier">xy</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">final_mode</span>)
|
|
47
|
+
<span class="ruby-identifier">cache_key</span> = <span class="ruby-identifier">get_cache_key</span>(<span class="ruby-value str">"log"</span>, <span class="ruby-identifier">x</span>, <span class="ruby-identifier">mode</span>, [<span class="ruby-value">2</span>, <span class="ruby-value">3</span>, <span class="ruby-value">5</span>, <span class="ruby-value">10</span>])
|
|
48
|
+
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">get_cached</span>(<span class="ruby-identifier">cache_key</span>, <span class="ruby-identifier">x</span>, <span class="ruby-identifier">iprec</span>)
|
|
49
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">nil?</span>)
|
|
50
|
+
<span class="ruby-identifier">y</span> = <span class="ruby-identifier">log_raw</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">prec</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
|
|
51
|
+
<span class="ruby-identifier">set_cached</span>(<span class="ruby-identifier">cache_key</span>, <span class="ruby-identifier">y</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">cache_result</span>
|
|
52
|
+
<span class="ruby-keyword kw">end</span>
|
|
232
53
|
|
|
233
|
-
|
|
54
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">final_mode</span>)
|
|
234
55
|
|
|
235
|
-
<span class="ruby-keyword kw">end</span></pre>
|
|
56
|
+
<span class="ruby-keyword kw">end</span></pre>
|
|
236
57
|
</body>
|
|
237
58
|
</html>
|