long-decimal 0.01.01 → 0.01.02

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 (193) hide show
  1. data/README +17 -94
  2. data/VERSION +1 -1
  3. data/doc/classes/Integer.html +239 -0
  4. data/doc/classes/Integer.src/M000036.html +18 -0
  5. data/doc/classes/Integer.src/M000039.html +145 -0
  6. data/doc/classes/LongDecimal.html +453 -399
  7. data/doc/classes/LongDecimal.src/M000040.html +4 -4
  8. data/doc/classes/LongDecimal.src/M000041.html +4 -4
  9. data/doc/classes/LongDecimal.src/M000042.html +4 -6
  10. data/doc/classes/LongDecimal.src/M000043.html +4 -106
  11. data/doc/classes/LongDecimal.src/M000044.html +4 -21
  12. data/doc/classes/LongDecimal.src/M000045.html +4 -11
  13. data/doc/classes/LongDecimal.src/M000046.html +6 -27
  14. data/doc/classes/LongDecimal.src/M000047.html +103 -16
  15. data/doc/classes/LongDecimal.src/M000048.html +21 -4
  16. data/doc/classes/LongDecimal.src/M000049.html +10 -14
  17. data/doc/classes/LongDecimal.src/M000050.html +22 -36
  18. data/doc/classes/LongDecimal.src/M000051.html +34 -4
  19. data/doc/classes/LongDecimal.src/M000052.html +17 -6
  20. data/doc/classes/LongDecimal.src/M000053.html +4 -6
  21. data/doc/classes/LongDecimal.src/M000054.html +15 -4
  22. data/doc/classes/LongDecimal.src/M000055.html +44 -12
  23. data/doc/classes/LongDecimal.src/M000056.html +4 -7
  24. data/doc/classes/LongDecimal.src/M000057.html +8 -4
  25. data/doc/classes/LongDecimal.src/M000058.html +6 -15
  26. data/doc/classes/LongDecimal.src/M000059.html +4 -13
  27. data/doc/classes/LongDecimal.src/M000060.html +15 -4
  28. data/doc/classes/LongDecimal.src/M000061.html +7 -5
  29. data/doc/classes/LongDecimal.src/M000062.html +4 -4
  30. data/doc/classes/LongDecimal.src/M000063.html +15 -5
  31. data/doc/classes/LongDecimal.src/M000064.html +13 -5
  32. data/doc/classes/LongDecimal.src/M000065.html +4 -4
  33. data/doc/classes/LongDecimal.src/M000067.html +4 -8
  34. data/doc/classes/LongDecimal.src/M000068.html +5 -9
  35. data/doc/classes/LongDecimal.src/M000069.html +5 -9
  36. data/doc/classes/LongDecimal.src/M000070.html +4 -9
  37. data/doc/classes/LongDecimal.src/M000071.html +4 -4
  38. data/doc/classes/LongDecimal.src/M000072.html +6 -17
  39. data/doc/classes/LongDecimal.src/M000073.html +7 -7
  40. data/doc/classes/LongDecimal.src/M000074.html +7 -7
  41. data/doc/classes/LongDecimal.src/M000075.html +7 -19
  42. data/doc/classes/LongDecimal.src/M000076.html +4 -8
  43. data/doc/classes/LongDecimal.src/M000077.html +19 -5
  44. data/doc/classes/LongDecimal.src/M000078.html +7 -7
  45. data/doc/classes/LongDecimal.src/M000079.html +7 -7
  46. data/doc/classes/LongDecimal.src/M000080.html +19 -7
  47. data/doc/classes/LongDecimal.src/M000081.html +8 -4
  48. data/doc/classes/LongDecimal.src/M000082.html +5 -7
  49. data/doc/classes/LongDecimal.src/M000083.html +8 -6
  50. data/doc/classes/LongDecimal.src/M000084.html +9 -4
  51. data/doc/classes/LongDecimal.src/M000085.html +9 -4
  52. data/doc/classes/LongDecimal.src/M000086.html +4 -9
  53. data/doc/classes/LongDecimal.src/M000087.html +6 -8
  54. data/doc/classes/LongDecimal.src/M000088.html +7 -5
  55. data/doc/classes/LongDecimal.src/M000089.html +4 -9
  56. data/doc/classes/LongDecimal.src/M000090.html +4 -4
  57. data/doc/classes/LongDecimal.src/M000091.html +9 -4
  58. data/doc/classes/LongDecimal.src/M000092.html +9 -4
  59. data/doc/classes/LongDecimal.src/M000093.html +5 -4
  60. data/doc/classes/LongDecimal.src/M000094.html +7 -57
  61. data/doc/classes/LongDecimal.src/M000095.html +4 -4
  62. data/doc/classes/LongDecimal.src/M000096.html +4 -4
  63. data/doc/classes/LongDecimal.src/M000097.html +4 -5
  64. data/doc/classes/LongDecimal.src/M000098.html +4 -5
  65. data/doc/classes/LongDecimal.src/M000099.html +59 -5
  66. data/doc/classes/LongDecimal.src/M000100.html +4 -5
  67. data/doc/classes/LongDecimal.src/M000101.html +4 -4
  68. data/doc/classes/LongDecimal.src/M000104.html +19 -0
  69. data/doc/classes/LongDecimal.src/M000105.html +19 -0
  70. data/doc/classes/LongDecimal.src/M000106.html +18 -0
  71. data/doc/classes/LongDecimal.src/M000107.html +18 -0
  72. data/doc/classes/LongDecimal.src/M000108.html +18 -0
  73. data/doc/classes/LongDecimal.src/M000109.html +18 -0
  74. data/doc/classes/LongDecimalBase.html +69 -66
  75. data/doc/classes/LongDecimalBase.src/M000113.html +4 -9
  76. data/doc/classes/LongDecimalBase.src/M000114.html +4 -5
  77. data/doc/classes/LongDecimalBase.src/M000115.html +4 -9
  78. data/doc/classes/LongDecimalBase.src/M000116.html +4 -9
  79. data/doc/classes/LongDecimalBase.src/M000117.html +4 -5
  80. data/doc/classes/LongDecimalBase.src/M000118.html +23 -0
  81. data/doc/classes/LongDecimalBase.src/M000121.html +23 -0
  82. data/doc/classes/LongDecimalBase.src/M000122.html +19 -0
  83. data/doc/classes/LongDecimalBase.src/M000123.html +18 -0
  84. data/doc/classes/LongDecimalQuot.html +33 -27
  85. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  86. data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
  87. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  88. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  89. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  90. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  91. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  92. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  93. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  94. data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
  95. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  96. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  97. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  98. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  99. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  100. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  101. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  102. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  103. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  104. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  105. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  106. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  107. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  108. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  109. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  110. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  111. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  112. data/doc/classes/LongDecimalQuot.src/M000030.html +1 -1
  113. data/doc/classes/LongDecimalQuot.src/M000031.html +1 -1
  114. data/doc/classes/LongDecimalQuot.src/M000034.html +1 -1
  115. data/doc/classes/LongDecimalQuot.src/M000035.html +1 -1
  116. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +25 -24
  117. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000156.html +22 -0
  118. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000157.html +18 -0
  119. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000158.html +18 -0
  120. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000159.html +18 -0
  121. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000161.html +25 -0
  122. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000162.html +18 -0
  123. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000163.html +18 -0
  124. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000164.html +18 -0
  125. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.html +178 -0
  126. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000165.html +25 -0
  127. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000166.html +18 -0
  128. data/doc/classes/LongDecimalRoundingMode.html +41 -4
  129. data/doc/classes/LongMath/CacheKey.html +10 -10
  130. data/doc/classes/LongMath/CacheKey.src/M000155.html +36 -0
  131. data/doc/classes/LongMath/CacheKey.src/M000160.html +36 -0
  132. data/doc/classes/LongMath.html +246 -235
  133. data/doc/classes/LongMath.src/M000124.html +5 -18
  134. data/doc/classes/LongMath.src/M000125.html +4 -18
  135. data/doc/classes/LongMath.src/M000126.html +4 -5
  136. data/doc/classes/LongMath.src/M000127.html +5 -29
  137. data/doc/classes/LongMath.src/M000128.html +4 -5
  138. data/doc/classes/LongMath.src/M000129.html +14 -53
  139. data/doc/classes/LongMath.src/M000130.html +17 -20
  140. data/doc/classes/LongMath.src/M000131.html +5 -36
  141. data/doc/classes/LongMath.src/M000132.html +29 -6
  142. data/doc/classes/LongMath.src/M000133.html +5 -33
  143. data/doc/classes/LongMath.src/M000134.html +47 -41
  144. data/doc/classes/LongMath.src/M000135.html +21 -7
  145. data/doc/classes/LongMath.src/M000136.html +36 -4
  146. data/doc/classes/LongMath.src/M000137.html +6 -4
  147. data/doc/classes/LongMath.src/M000138.html +31 -70
  148. data/doc/classes/LongMath.src/M000139.html +45 -38
  149. data/doc/classes/LongMath.src/M000140.html +7 -4
  150. data/doc/classes/LongMath.src/M000141.html +4 -4
  151. data/doc/classes/LongMath.src/M000142.html +4 -6
  152. data/doc/classes/LongMath.src/M000143.html +67 -14
  153. data/doc/classes/LongMath.src/M000144.html +39 -14
  154. data/doc/classes/LongMath.src/M000145.html +4 -44
  155. data/doc/classes/LongMath.src/M000146.html +5 -339
  156. data/doc/classes/LongMath.src/M000147.html +6 -25
  157. data/doc/classes/LongMath.src/M000148.html +14 -75
  158. data/doc/classes/LongMath.src/M000149.html +33 -0
  159. data/doc/classes/LongMath.src/M000150.html +58 -0
  160. data/doc/classes/LongMath.src/M000151.html +406 -0
  161. data/doc/classes/LongMath.src/M000152.html +63 -0
  162. data/doc/classes/LongMath.src/M000153.html +117 -0
  163. data/doc/classes/LongMath.src/M000154.html +150 -0
  164. data/doc/classes/LongMath.src/M000155.html +63 -0
  165. data/doc/classes/LongMath.src/M000156.html +18 -0
  166. data/doc/classes/LongMath.src/M000157.html +19 -0
  167. data/doc/classes/LongMath.src/M000158.html +18 -0
  168. data/doc/classes/LongMath.src/M000159.html +19 -0
  169. data/doc/classes/Numeric.html +23 -21
  170. data/doc/classes/Numeric.src/M000106.html +18 -0
  171. data/doc/classes/Numeric.src/M000110.html +23 -0
  172. data/doc/classes/Numeric.src/M000111.html +18 -0
  173. data/doc/classes/Rational.html +18 -16
  174. data/doc/classes/Rational.src/M000107.html +23 -0
  175. data/doc/classes/Rational.src/M000112.html +23 -0
  176. data/doc/created.rid +1 -1
  177. data/doc/dot/f_0.dot +23 -1
  178. data/doc/dot/f_0.png +0 -0
  179. data/doc/dot/m_0_0.png +0 -0
  180. data/doc/dot/m_0_1.dot +13 -0
  181. data/doc/dot/m_0_1.png +0 -0
  182. data/doc/files/lib/long-decimal_rb.html +15 -13
  183. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  184. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  185. data/doc/fr_class_index.html +2 -0
  186. data/doc/fr_method_index.html +131 -124
  187. data/lib/long-decimal.rb +373 -49
  188. data/test/testlongdecimal.rb +689 -7
  189. data/test/testlongdeclib.rb +51 -11
  190. data/test/testrandlib.rb +23 -7
  191. data/test/testrandom.rb +4 -4
  192. data/test/testrandpower.rb +11 -9
  193. metadata +48 -3
@@ -5,14 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>ten! (LongDecimal)</title>
8
+ <title>new! (LongDecimal)</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 265</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">ten!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
- <span class="ruby-identifier">new</span>(<span class="ruby-value">10</span><span class="ruby-operator">**</span>(<span class="ruby-identifier">s</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>), <span class="ruby-identifier">s</span>)
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 439</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">new!</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">s</span>)
16
16
  <span class="ruby-keyword kw">end</span></pre>
17
17
  </body>
18
18
  </html>
@@ -5,14 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>minus_one! (LongDecimal)</title>
8
+ <title>zero! (LongDecimal)</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 274</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">minus_one!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
- <span class="ruby-identifier">new</span>(<span class="ruby-value">-1</span><span class="ruby-operator">*</span><span class="ruby-value">10</span><span class="ruby-operator">**</span><span class="ruby-identifier">s</span>, <span class="ruby-identifier">s</span>)
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 447</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">zero!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">0</span>, <span class="ruby-identifier">s</span>)
16
16
  <span class="ruby-keyword kw">end</span></pre>
17
17
  </body>
18
18
  </html>
@@ -5,16 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>power_of_ten! (LongDecimal)</title>
8
+ <title>one! (LongDecimal)</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 284</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">power_of_ten!</span>(<span class="ruby-identifier">e</span>, <span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
- <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">check_is_int</span>(<span class="ruby-identifier">e</span>, <span class="ruby-value str">&quot;e&quot;</span>)
16
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative 1st arg \&quot;#{e.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>
17
- <span class="ruby-identifier">new</span>(<span class="ruby-value">10</span><span class="ruby-operator">**</span>(<span class="ruby-identifier">s</span><span class="ruby-operator">+</span><span class="ruby-identifier">e</span>), <span class="ruby-identifier">s</span>)
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 456</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">one!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">10</span><span class="ruby-operator">**</span><span class="ruby-identifier">s</span>, <span class="ruby-identifier">s</span>)
18
16
  <span class="ruby-keyword kw">end</span></pre>
19
17
  </body>
20
18
  </html>
@@ -5,116 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>new (LongDecimal)</title>
8
+ <title>two! (LongDecimal)</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 297</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">s</span>)
15
-
16
- <span class="ruby-comment cmt"># handle some obvious errors with x first</span>
17
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non numeric 1st arg \&quot;#{x.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Numeric</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">String</span>)
18
- <span class="ruby-comment cmt"># we could maybe even work with complex number, if their imaginary part is zero.</span>
19
- <span class="ruby-comment cmt"># but this is not so important to deal with, so we raise an error anyway.</span>
20
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;complex numbers not supported \&quot;#{x.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Complex</span>
21
-
22
- <span class="ruby-comment cmt"># handle some obvious errors with optional second parameter, if present</span>
23
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non integer 2nd arg \&quot;#{s.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
24
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative 2nd arg \&quot;#{s.inspect}\&quot;&quot;</span> <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>
25
-
26
- <span class="ruby-comment cmt"># scale is the second parameter or 0 if it is missing</span>
27
- <span class="ruby-identifier">scale</span> = <span class="ruby-identifier">s</span>
28
- <span class="ruby-comment cmt"># int_val is the integral value that is multiplied by some 10**-n</span>
29
- <span class="ruby-identifier">int_val</span> = <span class="ruby-value">0</span>
30
-
31
- <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> <span class="ruby-keyword kw">then</span>
32
- <span class="ruby-comment cmt"># integers are trivial to handle</span>
33
- <span class="ruby-identifier">int_val</span> = <span class="ruby-identifier">x</span>
34
-
35
- <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Rational</span> <span class="ruby-keyword kw">then</span>
36
- <span class="ruby-comment cmt"># rationals are rounded somehow</span>
37
- <span class="ruby-comment cmt"># we need to come up with a better rule here.</span>
38
- <span class="ruby-comment cmt"># if denominator is any product of powers of 2 and 5, we do not need to round</span>
39
- <span class="ruby-identifier">denom</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">denominator</span>
40
- <span class="ruby-identifier">mul_2</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">multiplicity_of_factor</span>(<span class="ruby-identifier">denom</span>, <span class="ruby-value">2</span>)
41
- <span class="ruby-identifier">mul_5</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">multiplicity_of_factor</span>(<span class="ruby-identifier">denom</span>, <span class="ruby-value">5</span>)
42
- <span class="ruby-identifier">iscale</span> = [<span class="ruby-identifier">mul_2</span>, <span class="ruby-identifier">mul_5</span>].<span class="ruby-identifier">max</span>
43
- <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale</span>
44
- <span class="ruby-identifier">denom</span> <span class="ruby-operator">/=</span> <span class="ruby-value">2</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">mul_2</span>
45
- <span class="ruby-identifier">denom</span> <span class="ruby-operator">/=</span> <span class="ruby-value">5</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">mul_5</span>
46
- <span class="ruby-identifier">iscale2</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log10</span>(<span class="ruby-identifier">denom</span>).<span class="ruby-identifier">ceil</span>
47
- <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale2</span>
48
- <span class="ruby-identifier">int_val</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">*</span> <span class="ruby-value">10</span> <span class="ruby-operator">**</span> (<span class="ruby-identifier">iscale2</span><span class="ruby-operator">+</span><span class="ruby-identifier">iscale</span>)).<span class="ruby-identifier">to_i</span>
49
-
50
- <span class="ruby-keyword kw">else</span>
51
- <span class="ruby-comment cmt"># we assume a string or a floating point number</span>
52
- <span class="ruby-comment cmt"># floating point number or BigDecimal is converted to string, so</span>
53
- <span class="ruby-comment cmt"># we only deal with strings</span>
54
- <span class="ruby-comment cmt"># this operation is not so common, so there is no urgent need to</span>
55
- <span class="ruby-comment cmt"># optimize it</span>
56
- <span class="ruby-identifier">num_str</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_s</span>
57
- <span class="ruby-identifier">len</span> = <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">length</span>
58
-
59
- <span class="ruby-comment cmt"># handle the obvious error that string is empty</span>
60
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;1st arg must not be empty string. \&quot;#{num_str.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">len</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
61
-
62
- <span class="ruby-comment cmt"># remove spaces and underscores</span>
63
- <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span> <span class="ruby-regexp re">/\s/</span>, <span class="ruby-value str">&quot;&quot;</span>
64
- <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span> <span class="ruby-regexp re">/_/</span>, <span class="ruby-value str">&quot;&quot;</span>
65
-
66
- <span class="ruby-comment cmt"># handle sign</span>
67
- <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span> <span class="ruby-regexp re">/^\+/</span>, <span class="ruby-value str">&quot;&quot;</span>
68
- <span class="ruby-identifier">negative</span> = <span class="ruby-keyword kw">false</span>
69
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span> <span class="ruby-regexp re">/^-/</span>, <span class="ruby-value str">&quot;&quot;</span> <span class="ruby-keyword kw">then</span>
70
- <span class="ruby-identifier">negative</span> = <span class="ruby-keyword kw">true</span>
71
- <span class="ruby-keyword kw">end</span>
72
-
73
- <span class="ruby-comment cmt"># split in parts before and after decimal point</span>
74
- <span class="ruby-identifier">num_arr</span> = <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">split</span> <span class="ruby-regexp re">/\./</span>
75
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_arr</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">2</span> <span class="ruby-keyword kw">then</span>
76
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;1st arg contains more than one . \&quot;#{num_str.inspect}\&quot;&quot;</span>
77
- <span class="ruby-keyword kw">end</span>
78
- <span class="ruby-identifier">num_int</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">0</span>]
79
- <span class="ruby-identifier">num_rem</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">1</span>]
80
- <span class="ruby-identifier">num_frac</span> = <span class="ruby-keyword kw">nil</span>
81
- <span class="ruby-identifier">num_exp</span> = <span class="ruby-keyword kw">nil</span>
82
- <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">num_rem</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">then</span>
83
- <span class="ruby-identifier">num_arr</span> = <span class="ruby-identifier">num_rem</span>.<span class="ruby-identifier">split</span> <span class="ruby-regexp re">/[Ee]/</span>
84
- <span class="ruby-identifier">num_frac</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">0</span>]
85
- <span class="ruby-identifier">num_exp</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">1</span>]
86
- <span class="ruby-keyword kw">end</span>
87
-
88
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_frac</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">then</span>
89
- <span class="ruby-identifier">num_frac</span> = <span class="ruby-value str">&quot;&quot;</span>
90
- <span class="ruby-keyword kw">end</span>
91
-
92
- <span class="ruby-comment cmt"># handle optional e-part of floating point number represented as</span>
93
- <span class="ruby-comment cmt"># string</span>
94
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword kw">then</span>
95
- <span class="ruby-identifier">num_exp</span> = <span class="ruby-value str">&quot;0&quot;</span>
96
- <span class="ruby-keyword kw">end</span>
97
- <span class="ruby-identifier">num_exp</span> = <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">to_i</span>
98
- <span class="ruby-identifier">iscale</span> = <span class="ruby-identifier">num_frac</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">num_exp</span>
99
- <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale</span>
100
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">scale</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>)
101
- <span class="ruby-identifier">num_frac</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">&quot;0&quot;</span> <span class="ruby-operator">*</span> (<span class="ruby-operator">-</span><span class="ruby-identifier">scale</span>)
102
- <span class="ruby-identifier">scale</span> = <span class="ruby-value">0</span>
103
- <span class="ruby-keyword kw">end</span>
104
- <span class="ruby-identifier">int_val</span> = (<span class="ruby-identifier">num_int</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">num_frac</span>).<span class="ruby-identifier">to_i</span>
105
- <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">negative</span> <span class="ruby-keyword kw">then</span>
106
- <span class="ruby-identifier">int_val</span> = <span class="ruby-operator">-</span><span class="ruby-identifier">int_val</span>
107
- <span class="ruby-keyword kw">end</span>
108
- <span class="ruby-keyword kw">end</span>
109
- <span class="ruby-comment cmt"># scale is the number of digits that go after the decimal point</span>
110
- <span class="ruby-ivar">@scale</span> = <span class="ruby-identifier">scale</span>
111
- <span class="ruby-comment cmt"># int_val holds all the digits. The value actually expressed by self is</span>
112
- <span class="ruby-comment cmt"># int_val * 10**(-scale)</span>
113
- <span class="ruby-ivar">@int_val</span> = <span class="ruby-identifier">int_val</span>
114
- <span class="ruby-comment cmt"># used for storing the number of digits before the decimal point.</span>
115
- <span class="ruby-comment cmt"># Is nil, until it is used the first time</span>
116
- <span class="ruby-ivar">@digits10</span> = <span class="ruby-keyword kw">nil</span>
117
-
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 465</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">two!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">2</span><span class="ruby-operator">*</span><span class="ruby-value">10</span><span class="ruby-operator">**</span><span class="ruby-identifier">s</span>, <span class="ruby-identifier">s</span>)
118
16
  <span class="ruby-keyword kw">end</span></pre>
119
17
  </body>
120
18
  </html>
@@ -5,31 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>scale= (LongDecimal)</title>
8
+ <title>ten! (LongDecimal)</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 411</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scale=</span>(<span class="ruby-identifier">s</span>)
15
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non integer arg \&quot;#{s.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
16
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative arg \&quot;#{s.inspect}\&quot;&quot;</span> <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>
17
-
18
- <span class="ruby-comment cmt"># do not work too hard, if scale does not really change.</span>
19
- <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@scale</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword kw">then</span>
20
- <span class="ruby-comment cmt"># multiply int_val by a power of 10 in order to compensate for</span>
21
- <span class="ruby-comment cmt"># the change of scale and to keep number in the same order of magnitude.</span>
22
- <span class="ruby-identifier">d</span> = <span class="ruby-identifier">s</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@scale</span>
23
- <span class="ruby-identifier">f</span> = <span class="ruby-value">10</span> <span class="ruby-operator">**</span> (<span class="ruby-identifier">d</span>.<span class="ruby-identifier">abs</span>)
24
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">d</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
25
- <span class="ruby-ivar">@int_val</span> = (<span class="ruby-ivar">@int_val</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">f</span>).<span class="ruby-identifier">to_i</span>
26
- <span class="ruby-keyword kw">else</span>
27
- <span class="ruby-comment cmt"># here we actually do rounding</span>
28
- <span class="ruby-ivar">@int_val</span> = (<span class="ruby-ivar">@int_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">f</span>).<span class="ruby-identifier">to_i</span>
29
- <span class="ruby-keyword kw">end</span>
30
- <span class="ruby-ivar">@scale</span> = <span class="ruby-identifier">s</span>
31
- <span class="ruby-ivar">@digits10</span> = <span class="ruby-keyword kw">nil</span>
32
- <span class="ruby-keyword kw">end</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 474</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">ten!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">10</span><span class="ruby-operator">**</span>(<span class="ruby-identifier">s</span><span class="ruby-operator">+</span><span class="ruby-value">1</span>), <span class="ruby-identifier">s</span>)
33
16
  <span class="ruby-keyword kw">end</span></pre>
34
17
  </body>
35
18
  </html>
@@ -5,21 +5,14 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>round_trailing_zeros (LongDecimal)</title>
8
+ <title>minus_one! (LongDecimal)</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 437</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">round_trailing_zeros</span>
15
- <span class="ruby-identifier">n</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">multiplicity_of_10</span>(<span class="ruby-identifier">int_val</span>)
16
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">n</span>.<span class="ruby-identifier">zero?</span>) <span class="ruby-keyword kw">then</span>
17
- <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">self</span>
18
- <span class="ruby-keyword kw">end</span>
19
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">n</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">scale</span>) <span class="ruby-keyword kw">then</span>
20
- <span class="ruby-identifier">n</span> = <span class="ruby-identifier">scale</span>
21
- <span class="ruby-keyword kw">end</span>
22
- <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">scale</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">n</span>)
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 483</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">minus_one!</span>(<span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">-1</span><span class="ruby-operator">*</span><span class="ruby-value">10</span><span class="ruby-operator">**</span><span class="ruby-identifier">s</span>, <span class="ruby-identifier">s</span>)
23
16
  <span class="ruby-keyword kw">end</span></pre>
24
17
  </body>
25
18
  </html>
@@ -5,37 +5,16 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>round_to_scale (LongDecimal)</title>
8
+ <title>power_of_ten! (LongDecimal)</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 456</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">new_scale</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">ROUND_UNNECESSARY</span>)
15
-
16
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;new_scale #{new_scale.inspect} must be integer&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">new_scale</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
17
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;new_scale #{new_scale.inspect} must be &gt;= 0&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">new_scale</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">0</span>
18
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;mode #{mode.inspect} must be legal rounding mode&quot;</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">mode</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">RoundingModeClass</span>
19
- <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scale</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">new_scale</span> <span class="ruby-keyword kw">then</span>
20
- <span class="ruby-keyword kw">self</span>
21
- <span class="ruby-keyword kw">else</span>
22
- <span class="ruby-identifier">diff</span> = <span class="ruby-identifier">new_scale</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">scale</span>
23
- <span class="ruby-identifier">factor</span> = <span class="ruby-value">10</span> <span class="ruby-operator">**</span> (<span class="ruby-identifier">diff</span>.<span class="ruby-identifier">abs</span>)
24
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">diff</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
25
- <span class="ruby-comment cmt"># we become more precise, no rounding issues</span>
26
- <span class="ruby-identifier">new_int_val</span> = <span class="ruby-identifier">int_val</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">factor</span>
27
- <span class="ruby-keyword kw">else</span>
28
- <span class="ruby-identifier">quot</span>, <span class="ruby-identifier">rem</span> = <span class="ruby-identifier">int_val</span>.<span class="ruby-identifier">divmod</span>(<span class="ruby-identifier">factor</span>)
29
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rem</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
30
- <span class="ruby-identifier">new_int_val</span> = <span class="ruby-identifier">quot</span>
31
- <span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">ROUND_UNNECESSARY</span>) <span class="ruby-keyword kw">then</span>
32
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">&quot;mode ROUND_UNNECESSARY not applicable, remainder #{rem.to_s} is not zero&quot;</span>
33
- <span class="ruby-keyword kw">else</span>
34
- <span class="ruby-keyword kw">return</span> <span class="ruby-constant">LongDecimalQuot</span>(<span class="ruby-keyword kw">self</span>, <span class="ruby-constant">LongDecimal</span>(<span class="ruby-value">1</span>)).<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">new_scale</span>, <span class="ruby-identifier">mode</span>)
35
- <span class="ruby-keyword kw">end</span>
36
- <span class="ruby-keyword kw">end</span>
37
- <span class="ruby-constant">LongDecimal</span>(<span class="ruby-identifier">new_int_val</span>, <span class="ruby-identifier">new_scale</span>)
38
- <span class="ruby-keyword kw">end</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 493</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>.<span class="ruby-identifier">power_of_ten!</span>(<span class="ruby-identifier">e</span>, <span class="ruby-identifier">s</span> = <span class="ruby-value">0</span>)
15
+ <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">check_is_int</span>(<span class="ruby-identifier">e</span>, <span class="ruby-value str">&quot;e&quot;</span>)
16
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative 1st arg \&quot;#{e.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>
17
+ <span class="ruby-identifier">new</span>(<span class="ruby-value">10</span><span class="ruby-operator">**</span>(<span class="ruby-identifier">s</span><span class="ruby-operator">+</span><span class="ruby-identifier">e</span>), <span class="ruby-identifier">s</span>)
39
18
  <span class="ruby-keyword kw">end</span></pre>
40
19
  </body>
41
20
  </html>
@@ -5,29 +5,116 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>to_s (LongDecimal)</title>
8
+ <title>new (LongDecimal)</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 495</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">shown_scale</span> = <span class="ruby-ivar">@scale</span>, <span class="ruby-identifier">mode</span> = <span class="ruby-constant">ROUND_UNNECESSARY</span>, <span class="ruby-identifier">base</span> = <span class="ruby-value">10</span>)
15
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">base</span> <span class="ruby-operator">==</span> <span class="ruby-value">10</span>) <span class="ruby-keyword kw">then</span>
16
- <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">shown_scale</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@scale</span>)
17
- <span class="ruby-identifier">to_s_10</span>
18
- <span class="ruby-keyword kw">else</span>
19
- <span class="ruby-identifier">s</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-identifier">shown_scale</span>, <span class="ruby-identifier">mode</span>)
20
- <span class="ruby-identifier">s</span>.<span class="ruby-identifier">to_s_10</span>
21
- <span class="ruby-keyword kw">end</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 506</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">x</span>, <span class="ruby-identifier">s</span>)
15
+
16
+ <span class="ruby-comment cmt"># handle some obvious errors with x first</span>
17
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non numeric 1st arg \&quot;#{x.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Numeric</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span> (<span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">String</span>)
18
+ <span class="ruby-comment cmt"># we could maybe even work with complex number, if their imaginary part is zero.</span>
19
+ <span class="ruby-comment cmt"># but this is not so important to deal with, so we raise an error anyway.</span>
20
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;complex numbers not supported \&quot;#{x.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Complex</span>
21
+
22
+ <span class="ruby-comment cmt"># handle some obvious errors with optional second parameter, if present</span>
23
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non integer 2nd arg \&quot;#{s.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
24
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative 2nd arg \&quot;#{s.inspect}\&quot;&quot;</span> <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>
25
+
26
+ <span class="ruby-comment cmt"># scale is the second parameter or 0 if it is missing</span>
27
+ <span class="ruby-identifier">scale</span> = <span class="ruby-identifier">s</span>
28
+ <span class="ruby-comment cmt"># int_val is the integral value that is multiplied by some 10**-n</span>
29
+ <span class="ruby-identifier">int_val</span> = <span class="ruby-value">0</span>
30
+
31
+ <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> <span class="ruby-keyword kw">then</span>
32
+ <span class="ruby-comment cmt"># integers are trivial to handle</span>
33
+ <span class="ruby-identifier">int_val</span> = <span class="ruby-identifier">x</span>
34
+
35
+ <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">x</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Rational</span> <span class="ruby-keyword kw">then</span>
36
+ <span class="ruby-comment cmt"># rationals are rounded somehow</span>
37
+ <span class="ruby-comment cmt"># we need to come up with a better rule here.</span>
38
+ <span class="ruby-comment cmt"># if denominator is any product of powers of 2 and 5, we do not need to round</span>
39
+ <span class="ruby-identifier">denom</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">denominator</span>
40
+ <span class="ruby-identifier">mul_2</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">multiplicity_of_factor</span>(<span class="ruby-identifier">denom</span>, <span class="ruby-value">2</span>)
41
+ <span class="ruby-identifier">mul_5</span> = <span class="ruby-constant">LongMath</span>.<span class="ruby-identifier">multiplicity_of_factor</span>(<span class="ruby-identifier">denom</span>, <span class="ruby-value">5</span>)
42
+ <span class="ruby-identifier">iscale</span> = [<span class="ruby-identifier">mul_2</span>, <span class="ruby-identifier">mul_5</span>].<span class="ruby-identifier">max</span>
43
+ <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale</span>
44
+ <span class="ruby-identifier">denom</span> <span class="ruby-operator">/=</span> <span class="ruby-value">2</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">mul_2</span>
45
+ <span class="ruby-identifier">denom</span> <span class="ruby-operator">/=</span> <span class="ruby-value">5</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">mul_5</span>
46
+ <span class="ruby-identifier">iscale2</span> = <span class="ruby-constant">Math</span>.<span class="ruby-identifier">log10</span>(<span class="ruby-identifier">denom</span>).<span class="ruby-identifier">ceil</span>
47
+ <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale2</span>
48
+ <span class="ruby-identifier">int_val</span> = (<span class="ruby-identifier">x</span> <span class="ruby-operator">*</span> <span class="ruby-value">10</span> <span class="ruby-operator">**</span> (<span class="ruby-identifier">iscale2</span><span class="ruby-operator">+</span><span class="ruby-identifier">iscale</span>)).<span class="ruby-identifier">to_i</span>
49
+
22
50
  <span class="ruby-keyword kw">else</span>
23
- <span class="ruby-comment cmt"># base is not 10</span>
24
- <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">base</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-value">2</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-identifier">base</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">base</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">36</span> <span class="ruby-keyword kw">then</span>
25
- <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-value str">&quot;base must be integer between 2 and 36&quot;</span>
51
+ <span class="ruby-comment cmt"># we assume a string or a floating point number</span>
52
+ <span class="ruby-comment cmt"># floating point number or BigDecimal is converted to string, so</span>
53
+ <span class="ruby-comment cmt"># we only deal with strings</span>
54
+ <span class="ruby-comment cmt"># this operation is not so common, so there is no urgent need to</span>
55
+ <span class="ruby-comment cmt"># optimize it</span>
56
+ <span class="ruby-identifier">num_str</span> = <span class="ruby-identifier">x</span>.<span class="ruby-identifier">to_s</span>
57
+ <span class="ruby-identifier">len</span> = <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">length</span>
58
+
59
+ <span class="ruby-comment cmt"># handle the obvious error that string is empty</span>
60
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;1st arg must not be empty string. \&quot;#{num_str.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">len</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
61
+
62
+ <span class="ruby-comment cmt"># remove spaces and underscores</span>
63
+ <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/\s/</span>, <span class="ruby-value str">&quot;&quot;</span>)
64
+ <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/_/</span>, <span class="ruby-value str">&quot;&quot;</span>)
65
+
66
+ <span class="ruby-comment cmt"># handle sign</span>
67
+ <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^\+/</span>, <span class="ruby-value str">&quot;&quot;</span>)
68
+ <span class="ruby-identifier">negative</span> = <span class="ruby-keyword kw">false</span>
69
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">gsub!</span>(<span class="ruby-regexp re">/^-/</span>, <span class="ruby-value str">&quot;&quot;</span>) <span class="ruby-keyword kw">then</span>
70
+ <span class="ruby-identifier">negative</span> = <span class="ruby-keyword kw">true</span>
71
+ <span class="ruby-keyword kw">end</span>
72
+
73
+ <span class="ruby-comment cmt"># split in parts before and after decimal point</span>
74
+ <span class="ruby-identifier">num_arr</span> = <span class="ruby-identifier">num_str</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp re">/\./</span>)
75
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_arr</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">2</span> <span class="ruby-keyword kw">then</span>
76
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;1st arg contains more than one . \&quot;#{num_str.inspect}\&quot;&quot;</span>
77
+ <span class="ruby-keyword kw">end</span>
78
+ <span class="ruby-identifier">num_int</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">0</span>]
79
+ <span class="ruby-identifier">num_rem</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">1</span>]
80
+ <span class="ruby-identifier">num_frac</span> = <span class="ruby-keyword kw">nil</span>
81
+ <span class="ruby-identifier">num_exp</span> = <span class="ruby-keyword kw">nil</span>
82
+ <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">num_rem</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">then</span>
83
+ <span class="ruby-identifier">num_arr</span> = <span class="ruby-identifier">num_rem</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp re">/[Ee]/</span>)
84
+ <span class="ruby-identifier">num_frac</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">0</span>]
85
+ <span class="ruby-identifier">num_exp</span> = <span class="ruby-identifier">num_arr</span>[<span class="ruby-value">1</span>]
86
+ <span class="ruby-keyword kw">end</span>
87
+
88
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_frac</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">then</span>
89
+ <span class="ruby-identifier">num_frac</span> = <span class="ruby-value str">&quot;&quot;</span>
90
+ <span class="ruby-keyword kw">end</span>
91
+
92
+ <span class="ruby-comment cmt"># handle optional e-part of floating point number represented as</span>
93
+ <span class="ruby-comment cmt"># string</span>
94
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword kw">then</span>
95
+ <span class="ruby-identifier">num_exp</span> = <span class="ruby-value str">&quot;0&quot;</span>
96
+ <span class="ruby-keyword kw">end</span>
97
+ <span class="ruby-identifier">num_exp</span> = <span class="ruby-identifier">num_exp</span>.<span class="ruby-identifier">to_i</span>
98
+ <span class="ruby-identifier">iscale</span> = <span class="ruby-identifier">num_frac</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">num_exp</span>
99
+ <span class="ruby-identifier">scale</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">iscale</span>
100
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">scale</span> <span class="ruby-operator">&lt;</span> <span class="ruby-value">0</span>)
101
+ <span class="ruby-identifier">num_frac</span> <span class="ruby-operator">+=</span> <span class="ruby-value str">&quot;0&quot;</span> <span class="ruby-operator">*</span> (<span class="ruby-operator">-</span><span class="ruby-identifier">scale</span>)
102
+ <span class="ruby-identifier">scale</span> = <span class="ruby-value">0</span>
103
+ <span class="ruby-keyword kw">end</span>
104
+ <span class="ruby-identifier">int_val</span> = (<span class="ruby-identifier">num_int</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">num_frac</span>).<span class="ruby-identifier">to_i</span>
105
+ <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">negative</span> <span class="ruby-keyword kw">then</span>
106
+ <span class="ruby-identifier">int_val</span> = <span class="ruby-operator">-</span><span class="ruby-identifier">int_val</span>
26
107
  <span class="ruby-keyword kw">end</span>
27
- <span class="ruby-identifier">quot</span> = (<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">move_point_right</span>(<span class="ruby-identifier">scale</span>) <span class="ruby-operator">*</span> <span class="ruby-identifier">base</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">shown_scale</span>) <span class="ruby-operator">/</span> <span class="ruby-value">10</span> <span class="ruby-operator">**</span> <span class="ruby-identifier">scale</span>
28
- <span class="ruby-identifier">rounded</span> = <span class="ruby-identifier">quot</span>.<span class="ruby-identifier">round_to_scale</span>(<span class="ruby-value">0</span>, <span class="ruby-identifier">mode</span>)
29
- <span class="ruby-identifier">rounded</span>.<span class="ruby-identifier">to_s_internal</span>(<span class="ruby-identifier">base</span>, <span class="ruby-identifier">shown_scale</span>)
30
108
  <span class="ruby-keyword kw">end</span>
109
+ <span class="ruby-comment cmt"># scale is the number of digits that go after the decimal point</span>
110
+ <span class="ruby-ivar">@scale</span> = <span class="ruby-identifier">scale</span>
111
+ <span class="ruby-comment cmt"># int_val holds all the digits. The value actually expressed by self is</span>
112
+ <span class="ruby-comment cmt"># int_val * 10**(-scale)</span>
113
+ <span class="ruby-ivar">@int_val</span> = <span class="ruby-identifier">int_val</span>
114
+ <span class="ruby-comment cmt"># used for storing the number of digits before the decimal point.</span>
115
+ <span class="ruby-comment cmt"># Is nil, until it is used the first time</span>
116
+ <span class="ruby-ivar">@digits10</span> = <span class="ruby-keyword kw">nil</span>
117
+
31
118
  <span class="ruby-keyword kw">end</span></pre>
32
119
  </body>
33
120
  </html>
@@ -5,14 +5,31 @@
5
5
 
6
6
  <html>
7
7
  <head>
8
- <title>to_s_10 (LongDecimal)</title>
8
+ <title>scale= (LongDecimal)</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 518</span>
14
- <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_s_10</span>
15
- <span class="ruby-identifier">to_s_internal</span>(<span class="ruby-value">10</span>, <span class="ruby-identifier">scale</span>)
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 620</span>
14
+ <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scale=</span>(<span class="ruby-identifier">s</span>)
15
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;non integer arg \&quot;#{s.inspect}\&quot;&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
16
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">&quot;negative arg \&quot;#{s.inspect}\&quot;&quot;</span> <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>
17
+
18
+ <span class="ruby-comment cmt"># do not work too hard, if scale does not really change.</span>
19
+ <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@scale</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">s</span> <span class="ruby-keyword kw">then</span>
20
+ <span class="ruby-comment cmt"># multiply int_val by a power of 10 in order to compensate for</span>
21
+ <span class="ruby-comment cmt"># the change of scale and to keep number in the same order of magnitude.</span>
22
+ <span class="ruby-identifier">d</span> = <span class="ruby-identifier">s</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@scale</span>
23
+ <span class="ruby-identifier">f</span> = <span class="ruby-value">10</span> <span class="ruby-operator">**</span> (<span class="ruby-identifier">d</span>.<span class="ruby-identifier">abs</span>)
24
+ <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">d</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
25
+ <span class="ruby-ivar">@int_val</span> = (<span class="ruby-ivar">@int_val</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">f</span>).<span class="ruby-identifier">to_i</span>
26
+ <span class="ruby-keyword kw">else</span>
27
+ <span class="ruby-comment cmt"># here we actually do rounding</span>
28
+ <span class="ruby-ivar">@int_val</span> = (<span class="ruby-ivar">@int_val</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">f</span>).<span class="ruby-identifier">to_i</span>
29
+ <span class="ruby-keyword kw">end</span>
30
+ <span class="ruby-ivar">@scale</span> = <span class="ruby-identifier">s</span>
31
+ <span class="ruby-ivar">@digits10</span> = <span class="ruby-keyword kw">nil</span>
32
+ <span class="ruby-keyword kw">end</span>
16
33
  <span class="ruby-keyword kw">end</span></pre>
17
34
  </body>
18
35
  </html>