long-decimal 0.00.19 → 0.00.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. data/README +25 -22
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/doc/classes/LongDecimal.html +327 -286
  5. data/doc/classes/LongDecimal.src/M000041.html +10 -4
  6. data/doc/classes/LongDecimal.src/M000042.html +3 -2
  7. data/doc/classes/LongDecimal.src/M000043.html +10 -26
  8. data/doc/classes/LongDecimal.src/M000044.html +24 -16
  9. data/doc/classes/LongDecimal.src/M000045.html +19 -4
  10. data/doc/classes/LongDecimal.src/M000046.html +4 -15
  11. data/doc/classes/LongDecimal.src/M000047.html +13 -26
  12. data/doc/classes/LongDecimal.src/M000048.html +28 -4
  13. data/doc/classes/LongDecimal.src/M000049.html +4 -8
  14. data/doc/classes/LongDecimal.src/M000050.html +8 -6
  15. data/doc/classes/LongDecimal.src/M000051.html +6 -4
  16. data/doc/classes/LongDecimal.src/M000052.html +4 -15
  17. data/doc/classes/LongDecimal.src/M000053.html +8 -24
  18. data/doc/classes/LongDecimal.src/M000054.html +6 -14
  19. data/doc/classes/LongDecimal.src/M000055.html +4 -13
  20. data/doc/classes/LongDecimal.src/M000056.html +15 -4
  21. data/doc/classes/LongDecimal.src/M000057.html +27 -0
  22. data/doc/classes/LongDecimal.src/M000058.html +4 -4
  23. data/doc/classes/LongDecimal.src/M000060.html +4 -4
  24. data/doc/classes/LongDecimal.src/M000061.html +5 -4
  25. data/doc/classes/LongDecimal.src/M000062.html +5 -8
  26. data/doc/classes/LongDecimal.src/M000063.html +4 -9
  27. data/doc/classes/LongDecimal.src/M000064.html +6 -7
  28. data/doc/classes/LongDecimal.src/M000065.html +6 -6
  29. data/doc/classes/LongDecimal.src/M000066.html +9 -4
  30. data/doc/classes/LongDecimal.src/M000067.html +7 -13
  31. data/doc/classes/LongDecimal.src/M000068.html +4 -9
  32. data/doc/classes/LongDecimal.src/M000069.html +13 -7
  33. data/doc/classes/LongDecimal.src/M000070.html +7 -18
  34. data/doc/classes/LongDecimal.src/M000071.html +8 -7
  35. data/doc/classes/LongDecimal.src/M000072.html +20 -5
  36. data/doc/classes/LongDecimal.src/M000073.html +6 -7
  37. data/doc/classes/LongDecimal.src/M000074.html +5 -9
  38. data/doc/classes/LongDecimal.src/M000075.html +5 -5
  39. data/doc/classes/LongDecimal.src/M000076.html +9 -4
  40. data/doc/classes/LongDecimal.src/M000077.html +7 -5
  41. data/doc/classes/LongDecimal.src/M000078.html +4 -7
  42. data/doc/classes/LongDecimal.src/M000079.html +7 -4
  43. data/doc/classes/LongDecimal.src/M000080.html +7 -4
  44. data/doc/classes/LongDecimal.src/M000081.html +4 -9
  45. data/doc/classes/LongDecimal.src/M000082.html +3 -8
  46. data/doc/classes/LongDecimal.src/M000083.html +9 -5
  47. data/doc/classes/LongDecimal.src/M000084.html +7 -7
  48. data/doc/classes/LongDecimal.src/M000085.html +5 -4
  49. data/doc/classes/LongDecimal.src/M000086.html +9 -4
  50. data/doc/classes/LongDecimal.src/M000087.html +4 -4
  51. data/doc/classes/LongDecimal.src/M000088.html +4 -4
  52. data/doc/classes/LongDecimal.src/M000089.html +4 -59
  53. data/doc/classes/LongDecimal.src/M000090.html +4 -4
  54. data/doc/classes/LongDecimal.src/M000091.html +59 -4
  55. data/doc/classes/LongDecimal.src/M000092.html +18 -0
  56. data/doc/classes/LongDecimal.src/M000093.html +18 -0
  57. data/doc/classes/LongDecimal.src/M000096.html +5 -4
  58. data/doc/classes/LongDecimal.src/M000097.html +5 -4
  59. data/doc/classes/LongDecimal.src/M000098.html +4 -4
  60. data/doc/classes/LongDecimal.src/M000099.html +4 -4
  61. data/doc/classes/LongDecimal.src/M000100.html +18 -0
  62. data/doc/classes/LongDecimal.src/M000101.html +18 -0
  63. data/doc/classes/LongDecimalBase.html +53 -53
  64. data/doc/classes/LongDecimalBase.src/M000104.html +4 -4
  65. data/doc/classes/LongDecimalBase.src/M000105.html +4 -4
  66. data/doc/classes/LongDecimalBase.src/M000106.html +4 -4
  67. data/doc/classes/LongDecimalBase.src/M000107.html +4 -4
  68. data/doc/classes/LongDecimalBase.src/M000108.html +18 -0
  69. data/doc/classes/LongDecimalBase.src/M000109.html +4 -9
  70. data/doc/classes/LongDecimalBase.src/M000112.html +9 -4
  71. data/doc/classes/LongDecimalBase.src/M000113.html +19 -0
  72. data/doc/classes/LongDecimalBase.src/M000114.html +18 -0
  73. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  74. data/doc/classes/LongDecimalQuot.src/M000004.html +22 -5
  75. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  76. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  77. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  78. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  79. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  80. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  81. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  82. data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
  83. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  84. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  85. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  86. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  87. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  88. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  89. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  90. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  91. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  92. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  93. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  94. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  95. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  96. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  97. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  98. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  99. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  100. data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
  101. data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
  102. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +10 -10
  103. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000141.html +22 -0
  104. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000142.html +18 -0
  105. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000146.html +22 -0
  106. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000147.html +18 -0
  107. data/doc/classes/LongMath.html +191 -137
  108. data/doc/classes/LongMath.src/M000115.html +5 -4
  109. data/doc/classes/LongMath.src/M000116.html +4 -5
  110. data/doc/classes/LongMath.src/M000117.html +4 -4
  111. data/doc/classes/LongMath.src/M000118.html +5 -18
  112. data/doc/classes/LongMath.src/M000119.html +4 -18
  113. data/doc/classes/LongMath.src/M000120.html +18 -5
  114. data/doc/classes/LongMath.src/M000121.html +16 -27
  115. data/doc/classes/LongMath.src/M000122.html +4 -4
  116. data/doc/classes/LongMath.src/M000123.html +17 -44
  117. data/doc/classes/LongMath.src/M000124.html +5 -21
  118. data/doc/classes/LongMath.src/M000125.html +49 -29
  119. data/doc/classes/LongMath.src/M000126.html +20 -47
  120. data/doc/classes/LongMath.src/M000127.html +36 -8
  121. data/doc/classes/LongMath.src/M000128.html +6 -4
  122. data/doc/classes/LongMath.src/M000129.html +33 -4
  123. data/doc/classes/LongMath.src/M000130.html +40 -56
  124. data/doc/classes/LongMath.src/M000131.html +8 -43
  125. data/doc/classes/LongMath.src/M000132.html +4 -10
  126. data/doc/classes/LongMath.src/M000133.html +4 -7
  127. data/doc/classes/LongMath.src/M000134.html +58 -15
  128. data/doc/classes/LongMath.src/M000135.html +39 -16
  129. data/doc/classes/LongMath.src/M000136.html +6 -39
  130. data/doc/classes/LongMath.src/M000137.html +5 -168
  131. data/doc/classes/LongMath.src/M000138.html +34 -0
  132. data/doc/classes/LongMath.src/M000139.html +34 -0
  133. data/doc/classes/LongMath.src/M000140.html +57 -0
  134. data/doc/classes/LongMath.src/M000141.html +219 -0
  135. data/doc/classes/LongMath.src/M000142.html +33 -0
  136. data/doc/classes/LongMath.src/M000143.html +70 -0
  137. data/doc/classes/LongMath.src/M000144.html +58 -0
  138. data/doc/classes/LongMath/CacheKey.html +164 -0
  139. data/doc/classes/LongMath/CacheKey.src/M000140.html +36 -0
  140. data/doc/classes/LongMath/CacheKey.src/M000145.html +36 -0
  141. data/doc/classes/Numeric.html +5 -5
  142. data/doc/classes/Numeric.src/M000102.html +23 -0
  143. data/doc/classes/Rational.html +5 -5
  144. data/doc/classes/Rational.src/M000103.html +23 -0
  145. data/doc/created.rid +1 -1
  146. data/doc/files/lib/long-decimal_rb.html +2 -2
  147. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  148. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  149. data/doc/fr_method_index.html +106 -101
  150. data/lib/long-decimal.rb +203 -85
  151. data/test/testlongdecimal.rb +372 -69
  152. metadata +28 -2
@@ -5,30 +5,53 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>log2 (LongMath)</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 2419</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
15
- <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
16
- <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
17
- <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
18
- <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2407</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) &lt;&lt; 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
+
19
18
  <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
19
  <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
20
  <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>)
21
+
22
+ <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">&lt;&lt;</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>)
23
+ <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>)
24
+ <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>
25
+ <span class="ruby-identifier">t</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>)
26
+ <span class="ruby-identifier">last_t</span> = <span class="ruby-value">1</span>
27
+ <span class="ruby-identifier">f</span> = <span class="ruby-value">0</span>
28
+ <span class="ruby-identifier">loop</span> <span class="ruby-keyword kw">do</span>
29
+ <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>
30
+ <span class="ruby-identifier">s</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">t</span>
31
+ <span class="ruby-identifier">f</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
32
+ <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>)
33
+ <span class="ruby-keyword kw">end</span>
34
+ <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>)
35
+ <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>)
36
+ <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>
37
+ <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>)
38
+ <span class="ruby-identifier">tu</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">unit</span>
39
+ <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">tu</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">last_t</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">tu</span>)
40
+ <span class="ruby-identifier">last_t</span> = <span class="ruby-identifier">tr</span>
41
+ <span class="ruby-keyword kw">end</span>
42
+ <span class="ruby-identifier">x_i</span> = <span class="ruby-value">1</span>
43
+ <span class="ruby-identifier">y_k</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">0</span>)
44
+ <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>
45
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">i</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
46
+ <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>)
47
+ <span class="ruby-keyword kw">end</span>
48
+ <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>)
24
49
  <span class="ruby-keyword kw">end</span>
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">&lt;&lt;</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-comment cmt"># puts(&quot;x=#{x} xx=#{xx} id=#{id} iprec=#{iprec}\n&quot;)</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">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>)
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">ln2</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>
50
+ <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>
51
+ <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>)
52
+ <span class="ruby-keyword kw">end</span>
53
+
54
+ <span class="ruby-identifier">y_k</span>
32
55
  <span class="ruby-keyword kw">end</span></pre>
33
56
  </body>
34
57
  </html>
@@ -5,53 +5,20 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>log_internal (LongMath)</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 2446</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">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>, <span class="ruby-identifier">cache_result</span> = <span class="ruby-keyword kw">true</span>)
15
- <span class="ruby-comment cmt"># check_is_ld(x)</span>
16
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not be positive&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</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">&quot;precision must be supplied either as precision of x=#{x} or explicitely&quot;</span>
22
- <span class="ruby-keyword kw">end</span>
23
- <span class="ruby-keyword kw">end</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 2453</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
15
+ <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
24
16
  <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</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">&quot;final_mode&quot;</span>)
30
17
  <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</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-identifier">iprec</span> = ((<span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-value">10</span>)<span class="ruby-operator">*</span><span class="ruby-value">1.20</span>).<span class="ruby-identifier">round</span>
34
- <span class="ruby-keyword kw">end</span>
35
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">prec</span>) <span class="ruby-keyword kw">then</span>
36
- <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span>
37
- <span class="ruby-keyword kw">end</span>
38
- <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-value str">&quot;iprec&quot;</span>)
39
18
  <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>)
40
- <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>)
19
+ <span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-value">2</span><span class="ruby-operator">*</span>(<span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>), <span class="ruby-identifier">mode</span>)
41
20
  <span class="ruby-keyword kw">end</span>
42
- <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>
43
- <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>)
44
- <span class="ruby-keyword kw">end</span>
45
-
46
- <span class="ruby-identifier">cache_key</span> = <span class="ruby-identifier">get_cache_key</span>(<span class="ruby-value str">&quot;log&quot;</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>])
47
- <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>)
48
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">nil?</span>)
49
- <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>)
50
- <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>
51
- <span class="ruby-keyword kw">end</span>
52
-
53
- <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>)
54
-
21
+ <span class="ruby-identifier">x</span>.<span class="ruby-identifier">sqrt</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
55
22
  <span class="ruby-keyword kw">end</span></pre>
56
23
  </body>
57
24
  </html>
@@ -5,180 +5,17 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>log_raw (LongMath)</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 2494</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</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>)
15
-
16
- <span class="ruby-comment cmt"># dprec = [ iprec - 1, (prec + 1) &lt;&lt; 1 ].min</span>
17
- <span class="ruby-identifier">dprec</span> = <span class="ruby-identifier">iprec</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
18
-
19
- <span class="ruby-identifier">y</span> = <span class="ruby-value">0</span>
20
- <span class="ruby-identifier">s</span> = <span class="ruby-value">1</span>
21
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">then</span>
22
- <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>)
23
- <span class="ruby-identifier">s</span> = <span class="ruby-value">-1</span>
24
- <span class="ruby-keyword kw">end</span>
25
- <span class="ruby-identifier">exp_part</span> = <span class="ruby-value">0</span>
26
- <span class="ruby-identifier">estimate</span> = <span class="ruby-value">0</span>
27
- <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</span> <span class="ruby-constant">MAX_FLOATABLE</span>) <span class="ruby-keyword kw">do</span>
28
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">exp_part</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
29
- <span class="ruby-identifier">estimate</span> = <span class="ruby-constant">MAX_EXP_ABLE</span>.<span class="ruby-identifier">to_ld</span>
30
- <span class="ruby-identifier">exp_part</span> = <span class="ruby-identifier">exp</span>(<span class="ruby-identifier">estimate</span>, <span class="ruby-identifier">iprec</span>)
31
- <span class="ruby-keyword kw">end</span>
32
- <span class="ruby-identifier">x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">exp_part</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-keyword kw">if</span> (<span class="ruby-identifier">s</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
34
- <span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">estimate</span>
35
- <span class="ruby-keyword kw">else</span>
36
- <span class="ruby-identifier">y</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">estimate</span>
37
- <span class="ruby-keyword kw">end</span>
38
- <span class="ruby-keyword kw">end</span>
39
-
40
- <span class="ruby-identifier">delta</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>, <span class="ruby-value">3</span>)
41
- <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">&gt;</span> <span class="ruby-identifier">delta</span> <span class="ruby-keyword kw">do</span>
42
- <span class="ruby-identifier">xf</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>
43
- <span class="ruby-identifier">mlx</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">xf</span>)
44
- <span class="ruby-identifier">estimate</span> = <span class="ruby-identifier">mlx</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-value">20</span>, <span class="ruby-identifier">mode</span>)
45
- <span class="ruby-identifier">exp_part</span> = <span class="ruby-identifier">exp</span>(<span class="ruby-identifier">estimate</span>, <span class="ruby-identifier">iprec</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value">1</span>)
46
- <span class="ruby-identifier">x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">exp_part</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
47
-
48
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">s</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
49
- <span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">estimate</span>
50
- <span class="ruby-keyword kw">else</span>
51
- <span class="ruby-identifier">y</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">estimate</span>
52
- <span class="ruby-keyword kw">end</span>
53
- <span class="ruby-keyword kw">end</span>
54
-
55
- <span class="ruby-identifier">factor</span> = <span class="ruby-value">1</span>
56
- <span class="ruby-comment cmt"># delta = LongDecimal(1, (iprec.to_f**(1/3)).round)</span>
57
- <span class="ruby-comment cmt"># while (x - 1).abs &gt; delta do</span>
58
- <span class="ruby-comment cmt"># x = sqrt(x)</span>
59
- <span class="ruby-comment cmt"># factor *= 2</span>
60
- <span class="ruby-comment cmt"># end</span>
61
-
62
- <span class="ruby-identifier">sum</span> = <span class="ruby-value">0</span>
63
- <span class="ruby-identifier">z</span> = <span class="ruby-value">1</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">x</span>
64
- <span class="ruby-identifier">i</span> = <span class="ruby-value">1</span>
65
- <span class="ruby-identifier">p</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
66
- <span class="ruby-identifier">d</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
67
- <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>
68
- <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>)
69
- <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>)
70
- <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
71
- <span class="ruby-identifier">sum</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">d</span>
72
-
73
- <span class="ruby-keyword kw">end</span>
74
-
75
- <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>)
76
- <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
77
- <span class="ruby-keyword kw">end</span>
78
-
79
- <span class="ruby-comment cmt">#</span>
80
- <span class="ruby-comment cmt"># calc the power of x with exponent y to the given precision as</span>
81
- <span class="ruby-comment cmt"># LongDecimal. Only supports values of y such that exp(y) still</span>
82
- <span class="ruby-comment cmt"># fits into a float (y &lt;= 709)</span>
83
- <span class="ruby-comment cmt">#</span>
84
- <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>)
85
- <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
86
- <span class="ruby-comment cmt"># check_is_ld(y, &quot;y&quot;)</span>
87
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">y</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-constant">MAX_EXP_ABLE</span>
88
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not be greater #{MAX_FLOATABLE}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-constant">MAX_FLOATABLE</span>
89
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not positive&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
90
- <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
91
- <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
92
-
93
- <span class="ruby-comment cmt"># try shortcut if exponent is an integer</span>
94
- <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">&amp;&amp;</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">is_int?</span>
95
- <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_i</span>
96
- <span class="ruby-keyword kw">end</span>
97
- <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>)
98
- <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>
99
- <span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>)
100
- <span class="ruby-keyword kw">end</span>
101
- <span class="ruby-identifier">z</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y</span>
102
- <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>)
103
- <span class="ruby-keyword kw">end</span>
104
-
105
- <span class="ruby-comment cmt"># it can be assumed that the exponent is not an integer, so it should</span>
106
- <span class="ruby-comment cmt"># be converted into LongDecimal</span>
107
- <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>)
108
- <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
109
- <span class="ruby-keyword kw">end</span>
110
-
111
- <span class="ruby-comment cmt"># try shortcut if base is an integer</span>
112
- <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>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">is_int?</span>
113
- <span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_i</span>
114
- <span class="ruby-keyword kw">end</span>
115
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>)
116
- <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>
117
- <span class="ruby-identifier">z0</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y0</span>
118
- <span class="ruby-identifier">y1</span> = <span class="ruby-identifier">y</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">y0</span>
119
- <span class="ruby-identifier">prec_extra</span> = <span class="ruby-value">0</span>
120
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y0</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>)
121
- <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">ceil</span>
122
- <span class="ruby-keyword kw">end</span>
123
- <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-identifier">mode</span>)
124
- <span class="ruby-comment cmt"># puts(&quot;prec=#{prec} prec_extra=#{prec_extra} x=#{x} y0=#{y0} z0=#{z0} y1=#{y1} z1=#{z1}\n&quot;)</span>
125
- <span class="ruby-identifier">z</span> = <span class="ruby-identifier">z0</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">z1</span>
126
- <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>)
127
- <span class="ruby-keyword kw">end</span>
128
- <span class="ruby-keyword kw">return</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-identifier">mode</span>)
129
- <span class="ruby-keyword kw">end</span>
130
-
131
- <span class="ruby-comment cmt">#</span>
132
- <span class="ruby-comment cmt"># internal functionality of exp. exposes some more parameters, that</span>
133
- <span class="ruby-comment cmt"># should usually be set to defaut values, in order to allow better testing.</span>
134
- <span class="ruby-comment cmt"># do not actually call this method unless you are testing exp.</span>
135
- <span class="ruby-comment cmt"># create a bug report, if the default settings for the parameters do</span>
136
- <span class="ruby-comment cmt"># not work correctly</span>
137
- <span class="ruby-comment cmt">#</span>
138
- <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 2467</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
139
15
  <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
140
- <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>
141
- <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>) <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
142
- <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>
143
- <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>)
144
- <span class="ruby-identifier">prec</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span>
145
- <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>)
146
- <span class="ruby-identifier">prec</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">scale</span>
147
- <span class="ruby-keyword kw">else</span>
148
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">&quot;precision must be supplied either as precision of x=#{x} or explicitely&quot;</span>
149
- <span class="ruby-keyword kw">end</span>
150
- <span class="ruby-keyword kw">end</span>
151
16
  <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
152
-
153
- <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>)
154
- <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>
155
- <span class="ruby-keyword kw">end</span>
156
- <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">final_mode</span>, <span class="ruby-value str">&quot;final_mode&quot;</span>)
157
17
  <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
158
-
159
- <span class="ruby-identifier">logx_y_f</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>) <span class="ruby-operator">*</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_f</span>)
160
-
161
- <span class="ruby-comment cmt"># iprec = (prec * 1.2 + 20 + (y.abs.to_f) * 1.5 * x.int_digits2).round</span>
162
- <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>
163
- <span class="ruby-identifier">iprec</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-operator">+</span> <span class="ruby-value">2</span>
164
- <span class="ruby-comment cmt"># puts(&quot;power_internal: prec=#{prec} iprec=#{iprec} logx_y_f=#{logx_y_f}\n&quot;)</span>
165
- <span class="ruby-keyword kw">end</span>
166
- <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>)
167
- <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>)
168
- <span class="ruby-keyword kw">end</span>
169
- <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>)
170
- <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
171
- <span class="ruby-keyword kw">end</span>
172
-
173
- <span class="ruby-comment cmt"># puts(&quot;power_internal: (got iprec, x &amp; y) x=#{x} y=#{y} logx_y=#{logx_y_f} iprec=#{iprec} prec=#{prec}\n&quot;)</span>
174
- <span class="ruby-identifier">logx</span> = <span class="ruby-identifier">log</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
175
- <span class="ruby-identifier">logx_y</span> = <span class="ruby-identifier">logx</span><span class="ruby-operator">*</span><span class="ruby-identifier">y</span>
176
- <span class="ruby-identifier">xy</span> = <span class="ruby-identifier">exp_internal</span>(<span class="ruby-identifier">logx_y</span>, <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>, <span class="ruby-identifier">mode</span>)
177
- <span class="ruby-comment cmt"># puts(&quot;power_internal: x=#{x} logx=#{logx} y=#{y} logx_y=#{logx_y} xy=#{xy} iprec=#{iprec} prec=#{prec}\n&quot;)</span>
178
- <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>)
179
-
180
- <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># power_internal</span>
181
-
182
- <span class="ruby-keyword kw">end</span></pre>
18
+ <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>)
19
+ <span class="ruby-keyword kw">end</span></pre>
183
20
  </body>
184
21
  </html>
@@ -0,0 +1,34 @@
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>log10 (LongMath)</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 2478</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
15
+
16
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
17
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
18
+ <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>
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>
32
+ <span class="ruby-keyword kw">end</span></pre>
33
+ </body>
34
+ </html>
@@ -0,0 +1,34 @@
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>log2 (LongMath)</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 2502</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">LongDecimal</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
15
+ <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
16
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
17
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
18
+ <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>
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
+ <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">&lt;&lt;</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-comment cmt"># puts(&quot;x=#{x} xx=#{xx} id=#{id} iprec=#{iprec}\n&quot;)</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">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>)
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">ln2</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>
32
+ <span class="ruby-keyword kw">end</span></pre>
33
+ </body>
34
+ </html>
@@ -0,0 +1,57 @@
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>log_internal (LongMath)</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 2529</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">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>, <span class="ruby-identifier">cache_result</span> = <span class="ruby-keyword kw">true</span>)
15
+ <span class="ruby-comment cmt"># check_is_ld(x)</span>
16
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not be positive&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</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">&quot;precision must be supplied either as precision of x=#{x} or explicitely&quot;</span>
22
+ <span class="ruby-keyword kw">end</span>
23
+ <span class="ruby-keyword kw">end</span>
24
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</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">&quot;final_mode&quot;</span>)
30
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</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-identifier">iprec</span> = ((<span class="ruby-identifier">prec</span><span class="ruby-operator">+</span><span class="ruby-value">10</span>)<span class="ruby-operator">*</span><span class="ruby-value">1.20</span>).<span class="ruby-identifier">round</span>
34
+ <span class="ruby-keyword kw">end</span>
35
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">iprec</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">prec</span>) <span class="ruby-keyword kw">then</span>
36
+ <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">prec</span>
37
+ <span class="ruby-keyword kw">end</span>
38
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-value str">&quot;iprec&quot;</span>)
39
+ <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>)
40
+ <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>)
41
+ <span class="ruby-keyword kw">end</span>
42
+ <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>
43
+ <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>)
44
+ <span class="ruby-keyword kw">end</span>
45
+
46
+ <span class="ruby-identifier">cache_key</span> = <span class="ruby-identifier">get_cache_key</span>(<span class="ruby-value str">&quot;log&quot;</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>])
47
+ <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>)
48
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">nil?</span>)
49
+ <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>)
50
+ <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>
51
+ <span class="ruby-keyword kw">end</span>
52
+
53
+ <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>)
54
+
55
+ <span class="ruby-keyword kw">end</span></pre>
56
+ </body>
57
+ </html>
@@ -0,0 +1,219 @@
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>log_raw (LongMath)</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 2577</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongMath</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>)
15
+
16
+ <span class="ruby-comment cmt"># dprec = [ iprec - 1, (prec + 1) &lt;&lt; 1 ].min</span>
17
+ <span class="ruby-identifier">dprec</span> = <span class="ruby-identifier">iprec</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
18
+
19
+ <span class="ruby-identifier">y</span> = <span class="ruby-value">0</span>
20
+ <span class="ruby-identifier">s</span> = <span class="ruby-value">1</span>
21
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">then</span>
22
+ <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>)
23
+ <span class="ruby-identifier">s</span> = <span class="ruby-value">-1</span>
24
+ <span class="ruby-keyword kw">end</span>
25
+ <span class="ruby-identifier">exp_part</span> = <span class="ruby-value">0</span>
26
+ <span class="ruby-identifier">estimate</span> = <span class="ruby-value">0</span>
27
+ <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</span> <span class="ruby-constant">MAX_FLOATABLE</span>) <span class="ruby-keyword kw">do</span>
28
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">exp_part</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
29
+ <span class="ruby-identifier">estimate</span> = <span class="ruby-constant">MAX_EXP_ABLE</span>.<span class="ruby-identifier">to_ld</span>
30
+ <span class="ruby-identifier">exp_part</span> = <span class="ruby-identifier">exp</span>(<span class="ruby-identifier">estimate</span>, <span class="ruby-identifier">iprec</span>)
31
+ <span class="ruby-keyword kw">end</span>
32
+ <span class="ruby-identifier">x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">exp_part</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-keyword kw">if</span> (<span class="ruby-identifier">s</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
34
+ <span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">estimate</span>
35
+ <span class="ruby-keyword kw">else</span>
36
+ <span class="ruby-identifier">y</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">estimate</span>
37
+ <span class="ruby-keyword kw">end</span>
38
+ <span class="ruby-keyword kw">end</span>
39
+
40
+ <span class="ruby-identifier">delta</span> = <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>, <span class="ruby-value">3</span>)
41
+ <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">&gt;</span> <span class="ruby-identifier">delta</span> <span class="ruby-keyword kw">do</span>
42
+ <span class="ruby-identifier">xf</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>
43
+ <span class="ruby-identifier">mlx</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log</span>(<span class="ruby-identifier">xf</span>)
44
+ <span class="ruby-identifier">estimate</span> = <span class="ruby-identifier">mlx</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-value">20</span>, <span class="ruby-identifier">mode</span>)
45
+ <span class="ruby-identifier">exp_part</span> = <span class="ruby-identifier">exp</span>(<span class="ruby-identifier">estimate</span>, <span class="ruby-identifier">iprec</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value">1</span>)
46
+ <span class="ruby-identifier">x</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">exp_part</span>).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
47
+
48
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">s</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
49
+ <span class="ruby-identifier">y</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">estimate</span>
50
+ <span class="ruby-keyword kw">else</span>
51
+ <span class="ruby-identifier">y</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">estimate</span>
52
+ <span class="ruby-keyword kw">end</span>
53
+ <span class="ruby-keyword kw">end</span>
54
+
55
+ <span class="ruby-identifier">factor</span> = <span class="ruby-value">1</span>
56
+ <span class="ruby-comment cmt"># delta = LongDecimal(1, (iprec.to_f**(1/3)).round)</span>
57
+ <span class="ruby-comment cmt"># while (x - 1).abs &gt; delta do</span>
58
+ <span class="ruby-comment cmt"># x = sqrt(x)</span>
59
+ <span class="ruby-comment cmt"># factor *= 2</span>
60
+ <span class="ruby-comment cmt"># end</span>
61
+
62
+ <span class="ruby-identifier">sum</span> = <span class="ruby-value">0</span>
63
+ <span class="ruby-identifier">z</span> = <span class="ruby-value">1</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">x</span>
64
+ <span class="ruby-identifier">i</span> = <span class="ruby-value">1</span>
65
+ <span class="ruby-identifier">p</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
66
+ <span class="ruby-identifier">d</span> = <span class="ruby-value">1</span>.<span class="ruby-identifier">to_ld</span>
67
+ <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>
68
+ <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>)
69
+ <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>)
70
+ <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
71
+ <span class="ruby-identifier">sum</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">d</span>
72
+
73
+ <span class="ruby-keyword kw">end</span>
74
+
75
+ <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>)
76
+ <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">y</span>
77
+ <span class="ruby-keyword kw">end</span>
78
+
79
+ <span class="ruby-identifier">private</span>
80
+
81
+ <span class="ruby-comment cmt">#</span>
82
+ <span class="ruby-comment cmt"># internal helper method for calculating the internal precision for power</span>
83
+ <span class="ruby-comment cmt">#</span>
84
+ <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>)
85
+ <span class="ruby-identifier">x_f</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_f</span>
86
+ <span class="ruby-identifier">y_f</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_f</span>
87
+ <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>)
88
+ <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>)
89
+ <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>
90
+ <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>)
91
+ <span class="ruby-identifier">iprec_y</span> = <span class="ruby-identifier">iprec_x</span>
92
+ <span class="ruby-identifier">iprec</span> = <span class="ruby-identifier">iprec_x</span> <span class="ruby-operator">+</span> <span class="ruby-value">2</span>
93
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">logx_f</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>)
94
+ <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>
95
+ <span class="ruby-keyword kw">end</span>
96
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">logy_f</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>)
97
+ <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>
98
+ <span class="ruby-keyword kw">end</span>
99
+ [ <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">iprec_x</span>, <span class="ruby-identifier">iprec_y</span> ]
100
+
101
+ <span class="ruby-keyword kw">end</span>
102
+
103
+ <span class="ruby-identifier">public</span>
104
+
105
+ <span class="ruby-comment cmt">#</span>
106
+ <span class="ruby-comment cmt"># calc the power of x with exponent y to the given precision as</span>
107
+ <span class="ruby-comment cmt"># LongDecimal. Only supports values of y such that exp(y) still</span>
108
+ <span class="ruby-comment cmt"># fits into a float (y &lt;= 709)</span>
109
+ <span class="ruby-comment cmt">#</span>
110
+ <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>)
111
+ <span class="ruby-comment cmt"># check_is_ld(x, &quot;x&quot;)</span>
112
+ <span class="ruby-comment cmt"># check_is_ld(y, &quot;y&quot;)</span>
113
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">y</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-constant">MAX_EXP_ABLE</span>
114
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not be greater #{MAX_FLOATABLE}&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-constant">MAX_FLOATABLE</span>
115
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;x=#{x.inspect} must not positive&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">x</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
116
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
117
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
118
+
119
+ <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>
120
+ <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>)
121
+ <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>
122
+ <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>)
123
+ <span class="ruby-keyword kw">end</span>
124
+
125
+ <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>)
126
+
127
+ <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>)
128
+ <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>)
129
+ <span class="ruby-keyword kw">end</span>
130
+ <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>)
131
+ <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>)
132
+ <span class="ruby-keyword kw">end</span>
133
+
134
+ <span class="ruby-comment cmt"># try shortcut if exponent is an integer</span>
135
+ <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">&amp;&amp;</span> <span class="ruby-identifier">y</span>.<span class="ruby-identifier">is_int?</span>
136
+ <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_i</span>
137
+ <span class="ruby-keyword kw">end</span>
138
+ <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>)
139
+ <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>
140
+ <span class="ruby-identifier">x</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>)
141
+ <span class="ruby-keyword kw">end</span>
142
+ <span class="ruby-identifier">z</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y</span>
143
+ <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>)
144
+ <span class="ruby-keyword kw">end</span>
145
+
146
+ <span class="ruby-comment cmt"># it can be assumed that the exponent is not an integer, so it should</span>
147
+ <span class="ruby-comment cmt"># be converted into LongDecimal</span>
148
+ <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>)
149
+ <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-identifier">mode</span>)
150
+ <span class="ruby-keyword kw">end</span>
151
+
152
+ <span class="ruby-comment cmt"># exponent is split in two parts, an integer part and a</span>
153
+ <span class="ruby-comment cmt"># LongDecimal with absolute value &lt;= 0.5</span>
154
+ <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>
155
+ <span class="ruby-identifier">z0</span> = <span class="ruby-identifier">x</span><span class="ruby-operator">**</span><span class="ruby-identifier">y0</span>
156
+ <span class="ruby-identifier">y1</span> = <span class="ruby-identifier">y</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">y0</span>
157
+ <span class="ruby-identifier">prec_extra</span> = <span class="ruby-value">0</span>
158
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">y0</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>)
159
+ <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>
160
+ <span class="ruby-keyword kw">end</span>
161
+ <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-identifier">mode</span>)
162
+ <span class="ruby-identifier">z</span> = <span class="ruby-identifier">z0</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">z1</span>
163
+ <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>)
164
+ <span class="ruby-keyword kw">end</span>
165
+
166
+ <span class="ruby-comment cmt">#</span>
167
+ <span class="ruby-comment cmt"># internal functionality of exp. exposes some more parameters, that</span>
168
+ <span class="ruby-comment cmt"># should usually be set to defaut values, in order to allow better testing.</span>
169
+ <span class="ruby-comment cmt"># do not actually call this method unless you are testing exp.</span>
170
+ <span class="ruby-comment cmt"># create a bug report, if the default settings for the parameters do</span>
171
+ <span class="ruby-comment cmt"># not work correctly</span>
172
+ <span class="ruby-comment cmt">#</span>
173
+ <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>)
174
+
175
+ <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>
176
+ <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>) <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">y</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalBase</span>)
177
+ <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>
178
+ <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>)
179
+ <span class="ruby-identifier">prec</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">scale</span>
180
+ <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>)
181
+ <span class="ruby-identifier">prec</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">scale</span>
182
+ <span class="ruby-keyword kw">else</span>
183
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">&quot;precision must be supplied either as precision of x=#{x} or explicitely&quot;</span>
184
+ <span class="ruby-keyword kw">end</span>
185
+ <span class="ruby-keyword kw">end</span>
186
+ <span class="ruby-identifier">check_is_prec</span>(<span class="ruby-identifier">prec</span>, <span class="ruby-value str">&quot;prec&quot;</span>)
187
+
188
+ <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>)
189
+ <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>
190
+ <span class="ruby-keyword kw">end</span>
191
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">final_mode</span>, <span class="ruby-value str">&quot;final_mode&quot;</span>)
192
+ <span class="ruby-identifier">check_is_mode</span>(<span class="ruby-identifier">mode</span>, <span class="ruby-value str">&quot;mode&quot;</span>)
193
+
194
+ <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>
195
+ <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>)
196
+ <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>
197
+ <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>)
198
+ <span class="ruby-keyword kw">end</span>
199
+
200
+ <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>
201
+ <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>)
202
+ <span class="ruby-keyword kw">end</span>
203
+ <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>)
204
+ <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>)
205
+ <span class="ruby-keyword kw">end</span>
206
+ <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>)
207
+ <span class="ruby-identifier">y</span> = <span class="ruby-identifier">y</span>.<span class="ruby-identifier">to_ld</span>(<span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
208
+ <span class="ruby-keyword kw">end</span>
209
+
210
+ <span class="ruby-identifier">logx</span> = <span class="ruby-identifier">log</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">iprec</span>, <span class="ruby-identifier">mode</span>)
211
+ <span class="ruby-identifier">logx_y</span> = <span class="ruby-identifier">logx</span><span class="ruby-operator">*</span><span class="ruby-identifier">y</span>
212
+ <span class="ruby-identifier">xy</span> = <span class="ruby-identifier">exp_internal</span>(<span class="ruby-identifier">logx_y</span>, <span class="ruby-identifier">prec</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>, <span class="ruby-identifier">mode</span>)
213
+ <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>)
214
+
215
+ <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># power_internal</span>
216
+
217
+ <span class="ruby-keyword kw">end</span></pre>
218
+ </body>
219
+ </html>