long-decimal 0.01.02 → 0.01.03

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) hide show
  1. data/README +58 -33
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/lib/long-decimal-extra.rb +378 -0
  5. data/lib/long-decimal.rb +277 -342
  6. data/test/testlongdecimal-extra.rb +645 -0
  7. data/test/testlongdecimal.rb +4 -605
  8. data/test/testlongdeclib.rb +4 -4
  9. data/test/testrandlib.rb +1 -1
  10. data/test/testrandom-extra.rb +76 -0
  11. data/test/testrandom.rb +4 -7
  12. data/test/testrandpower.rb +7 -4
  13. data/version.rb +1 -1
  14. metadata +5 -268
  15. data/doc/classes/Integer.html +0 -239
  16. data/doc/classes/Integer.src/M000036.html +0 -18
  17. data/doc/classes/Integer.src/M000039.html +0 -145
  18. data/doc/classes/LongDecimal.html +0 -1602
  19. data/doc/classes/LongDecimal.src/M000034.html +0 -18
  20. data/doc/classes/LongDecimal.src/M000035.html +0 -18
  21. data/doc/classes/LongDecimal.src/M000036.html +0 -18
  22. data/doc/classes/LongDecimal.src/M000037.html +0 -18
  23. data/doc/classes/LongDecimal.src/M000038.html +0 -18
  24. data/doc/classes/LongDecimal.src/M000039.html +0 -18
  25. data/doc/classes/LongDecimal.src/M000040.html +0 -18
  26. data/doc/classes/LongDecimal.src/M000041.html +0 -18
  27. data/doc/classes/LongDecimal.src/M000042.html +0 -18
  28. data/doc/classes/LongDecimal.src/M000043.html +0 -18
  29. data/doc/classes/LongDecimal.src/M000044.html +0 -18
  30. data/doc/classes/LongDecimal.src/M000045.html +0 -18
  31. data/doc/classes/LongDecimal.src/M000046.html +0 -20
  32. data/doc/classes/LongDecimal.src/M000047.html +0 -120
  33. data/doc/classes/LongDecimal.src/M000048.html +0 -35
  34. data/doc/classes/LongDecimal.src/M000049.html +0 -25
  35. data/doc/classes/LongDecimal.src/M000050.html +0 -41
  36. data/doc/classes/LongDecimal.src/M000051.html +0 -48
  37. data/doc/classes/LongDecimal.src/M000052.html +0 -33
  38. data/doc/classes/LongDecimal.src/M000053.html +0 -18
  39. data/doc/classes/LongDecimal.src/M000054.html +0 -29
  40. data/doc/classes/LongDecimal.src/M000055.html +0 -61
  41. data/doc/classes/LongDecimal.src/M000056.html +0 -18
  42. data/doc/classes/LongDecimal.src/M000057.html +0 -22
  43. data/doc/classes/LongDecimal.src/M000058.html +0 -20
  44. data/doc/classes/LongDecimal.src/M000059.html +0 -18
  45. data/doc/classes/LongDecimal.src/M000060.html +0 -29
  46. data/doc/classes/LongDecimal.src/M000061.html +0 -21
  47. data/doc/classes/LongDecimal.src/M000062.html +0 -18
  48. data/doc/classes/LongDecimal.src/M000063.html +0 -29
  49. data/doc/classes/LongDecimal.src/M000064.html +0 -27
  50. data/doc/classes/LongDecimal.src/M000065.html +0 -18
  51. data/doc/classes/LongDecimal.src/M000066.html +0 -18
  52. data/doc/classes/LongDecimal.src/M000067.html +0 -18
  53. data/doc/classes/LongDecimal.src/M000068.html +0 -19
  54. data/doc/classes/LongDecimal.src/M000069.html +0 -19
  55. data/doc/classes/LongDecimal.src/M000070.html +0 -18
  56. data/doc/classes/LongDecimal.src/M000071.html +0 -18
  57. data/doc/classes/LongDecimal.src/M000072.html +0 -22
  58. data/doc/classes/LongDecimal.src/M000073.html +0 -23
  59. data/doc/classes/LongDecimal.src/M000074.html +0 -23
  60. data/doc/classes/LongDecimal.src/M000075.html +0 -23
  61. data/doc/classes/LongDecimal.src/M000076.html +0 -18
  62. data/doc/classes/LongDecimal.src/M000077.html +0 -33
  63. data/doc/classes/LongDecimal.src/M000078.html +0 -23
  64. data/doc/classes/LongDecimal.src/M000079.html +0 -23
  65. data/doc/classes/LongDecimal.src/M000080.html +0 -35
  66. data/doc/classes/LongDecimal.src/M000081.html +0 -22
  67. data/doc/classes/LongDecimal.src/M000082.html +0 -19
  68. data/doc/classes/LongDecimal.src/M000083.html +0 -23
  69. data/doc/classes/LongDecimal.src/M000084.html +0 -23
  70. data/doc/classes/LongDecimal.src/M000085.html +0 -23
  71. data/doc/classes/LongDecimal.src/M000086.html +0 -18
  72. data/doc/classes/LongDecimal.src/M000087.html +0 -21
  73. data/doc/classes/LongDecimal.src/M000088.html +0 -21
  74. data/doc/classes/LongDecimal.src/M000089.html +0 -18
  75. data/doc/classes/LongDecimal.src/M000090.html +0 -18
  76. data/doc/classes/LongDecimal.src/M000091.html +0 -23
  77. data/doc/classes/LongDecimal.src/M000092.html +0 -23
  78. data/doc/classes/LongDecimal.src/M000093.html +0 -19
  79. data/doc/classes/LongDecimal.src/M000094.html +0 -23
  80. data/doc/classes/LongDecimal.src/M000095.html +0 -18
  81. data/doc/classes/LongDecimal.src/M000096.html +0 -18
  82. data/doc/classes/LongDecimal.src/M000097.html +0 -18
  83. data/doc/classes/LongDecimal.src/M000098.html +0 -18
  84. data/doc/classes/LongDecimal.src/M000099.html +0 -73
  85. data/doc/classes/LongDecimal.src/M000100.html +0 -18
  86. data/doc/classes/LongDecimal.src/M000101.html +0 -18
  87. data/doc/classes/LongDecimal.src/M000102.html +0 -18
  88. data/doc/classes/LongDecimal.src/M000103.html +0 -18
  89. data/doc/classes/LongDecimal.src/M000104.html +0 -19
  90. data/doc/classes/LongDecimal.src/M000105.html +0 -19
  91. data/doc/classes/LongDecimal.src/M000106.html +0 -18
  92. data/doc/classes/LongDecimal.src/M000107.html +0 -18
  93. data/doc/classes/LongDecimal.src/M000108.html +0 -18
  94. data/doc/classes/LongDecimal.src/M000109.html +0 -18
  95. data/doc/classes/LongDecimalBase.html +0 -359
  96. data/doc/classes/LongDecimalBase.src/M000101.html +0 -18
  97. data/doc/classes/LongDecimalBase.src/M000102.html +0 -18
  98. data/doc/classes/LongDecimalBase.src/M000103.html +0 -18
  99. data/doc/classes/LongDecimalBase.src/M000104.html +0 -18
  100. data/doc/classes/LongDecimalBase.src/M000105.html +0 -18
  101. data/doc/classes/LongDecimalBase.src/M000106.html +0 -18
  102. data/doc/classes/LongDecimalBase.src/M000107.html +0 -18
  103. data/doc/classes/LongDecimalBase.src/M000108.html +0 -18
  104. data/doc/classes/LongDecimalBase.src/M000109.html +0 -18
  105. data/doc/classes/LongDecimalBase.src/M000110.html +0 -18
  106. data/doc/classes/LongDecimalBase.src/M000111.html +0 -18
  107. data/doc/classes/LongDecimalBase.src/M000112.html +0 -18
  108. data/doc/classes/LongDecimalBase.src/M000113.html +0 -18
  109. data/doc/classes/LongDecimalBase.src/M000114.html +0 -18
  110. data/doc/classes/LongDecimalBase.src/M000115.html +0 -18
  111. data/doc/classes/LongDecimalBase.src/M000116.html +0 -18
  112. data/doc/classes/LongDecimalBase.src/M000117.html +0 -18
  113. data/doc/classes/LongDecimalBase.src/M000118.html +0 -23
  114. data/doc/classes/LongDecimalBase.src/M000121.html +0 -23
  115. data/doc/classes/LongDecimalBase.src/M000122.html +0 -19
  116. data/doc/classes/LongDecimalBase.src/M000123.html +0 -18
  117. data/doc/classes/LongDecimalQuot.html +0 -836
  118. data/doc/classes/LongDecimalQuot.src/M000003.html +0 -18
  119. data/doc/classes/LongDecimalQuot.src/M000004.html +0 -46
  120. data/doc/classes/LongDecimalQuot.src/M000005.html +0 -18
  121. data/doc/classes/LongDecimalQuot.src/M000006.html +0 -18
  122. data/doc/classes/LongDecimalQuot.src/M000007.html +0 -20
  123. data/doc/classes/LongDecimalQuot.src/M000008.html +0 -19
  124. data/doc/classes/LongDecimalQuot.src/M000009.html +0 -18
  125. data/doc/classes/LongDecimalQuot.src/M000010.html +0 -18
  126. data/doc/classes/LongDecimalQuot.src/M000011.html +0 -18
  127. data/doc/classes/LongDecimalQuot.src/M000012.html +0 -18
  128. data/doc/classes/LongDecimalQuot.src/M000013.html +0 -32
  129. data/doc/classes/LongDecimalQuot.src/M000014.html +0 -19
  130. data/doc/classes/LongDecimalQuot.src/M000015.html +0 -19
  131. data/doc/classes/LongDecimalQuot.src/M000016.html +0 -22
  132. data/doc/classes/LongDecimalQuot.src/M000017.html +0 -23
  133. data/doc/classes/LongDecimalQuot.src/M000018.html +0 -23
  134. data/doc/classes/LongDecimalQuot.src/M000019.html +0 -23
  135. data/doc/classes/LongDecimalQuot.src/M000020.html +0 -23
  136. data/doc/classes/LongDecimalQuot.src/M000021.html +0 -35
  137. data/doc/classes/LongDecimalQuot.src/M000022.html +0 -22
  138. data/doc/classes/LongDecimalQuot.src/M000023.html +0 -19
  139. data/doc/classes/LongDecimalQuot.src/M000024.html +0 -18
  140. data/doc/classes/LongDecimalQuot.src/M000025.html +0 -127
  141. data/doc/classes/LongDecimalQuot.src/M000026.html +0 -52
  142. data/doc/classes/LongDecimalQuot.src/M000027.html +0 -18
  143. data/doc/classes/LongDecimalQuot.src/M000028.html +0 -18
  144. data/doc/classes/LongDecimalQuot.src/M000029.html +0 -18
  145. data/doc/classes/LongDecimalQuot.src/M000030.html +0 -18
  146. data/doc/classes/LongDecimalQuot.src/M000031.html +0 -18
  147. data/doc/classes/LongDecimalQuot.src/M000032.html +0 -18
  148. data/doc/classes/LongDecimalQuot.src/M000033.html +0 -18
  149. data/doc/classes/LongDecimalQuot.src/M000034.html +0 -18
  150. data/doc/classes/LongDecimalQuot.src/M000035.html +0 -18
  151. data/doc/classes/LongDecimalRoundingMode.html +0 -242
  152. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +0 -214
  153. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000135.html +0 -22
  154. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000137.html +0 -22
  155. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000138.html +0 -22
  156. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000141.html +0 -22
  157. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000142.html +0 -18
  158. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000146.html +0 -22
  159. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000147.html +0 -18
  160. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000148.html +0 -22
  161. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000149.html +0 -18
  162. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000150.html +0 -22
  163. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000151.html +0 -18
  164. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000152.html +0 -18
  165. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000156.html +0 -22
  166. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000157.html +0 -18
  167. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000158.html +0 -18
  168. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000159.html +0 -18
  169. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000161.html +0 -25
  170. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000162.html +0 -18
  171. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000163.html +0 -18
  172. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000164.html +0 -18
  173. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.html +0 -178
  174. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000165.html +0 -25
  175. data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000166.html +0 -18
  176. data/doc/classes/LongMath.html +0 -911
  177. data/doc/classes/LongMath.src/M000112.html +0 -19
  178. data/doc/classes/LongMath.src/M000113.html +0 -19
  179. data/doc/classes/LongMath.src/M000114.html +0 -18
  180. data/doc/classes/LongMath.src/M000115.html +0 -19
  181. data/doc/classes/LongMath.src/M000116.html +0 -19
  182. data/doc/classes/LongMath.src/M000117.html +0 -18
  183. data/doc/classes/LongMath.src/M000118.html +0 -19
  184. data/doc/classes/LongMath.src/M000119.html +0 -19
  185. data/doc/classes/LongMath.src/M000120.html +0 -18
  186. data/doc/classes/LongMath.src/M000121.html +0 -18
  187. data/doc/classes/LongMath.src/M000122.html +0 -19
  188. data/doc/classes/LongMath.src/M000123.html +0 -18
  189. data/doc/classes/LongMath.src/M000124.html +0 -19
  190. data/doc/classes/LongMath.src/M000125.html +0 -18
  191. data/doc/classes/LongMath.src/M000126.html +0 -18
  192. data/doc/classes/LongMath.src/M000127.html +0 -19
  193. data/doc/classes/LongMath.src/M000128.html +0 -18
  194. data/doc/classes/LongMath.src/M000129.html +0 -32
  195. data/doc/classes/LongMath.src/M000130.html +0 -32
  196. data/doc/classes/LongMath.src/M000131.html +0 -19
  197. data/doc/classes/LongMath.src/M000132.html +0 -43
  198. data/doc/classes/LongMath.src/M000133.html +0 -19
  199. data/doc/classes/LongMath.src/M000134.html +0 -71
  200. data/doc/classes/LongMath.src/M000135.html +0 -35
  201. data/doc/classes/LongMath.src/M000136.html +0 -50
  202. data/doc/classes/LongMath.src/M000137.html +0 -20
  203. data/doc/classes/LongMath.src/M000138.html +0 -47
  204. data/doc/classes/LongMath.src/M000139.html +0 -65
  205. data/doc/classes/LongMath.src/M000140.html +0 -21
  206. data/doc/classes/LongMath.src/M000141.html +0 -18
  207. data/doc/classes/LongMath.src/M000142.html +0 -18
  208. data/doc/classes/LongMath.src/M000143.html +0 -87
  209. data/doc/classes/LongMath.src/M000144.html +0 -58
  210. data/doc/classes/LongMath.src/M000145.html +0 -18
  211. data/doc/classes/LongMath.src/M000146.html +0 -18
  212. data/doc/classes/LongMath.src/M000147.html +0 -20
  213. data/doc/classes/LongMath.src/M000148.html +0 -34
  214. data/doc/classes/LongMath.src/M000149.html +0 -33
  215. data/doc/classes/LongMath.src/M000150.html +0 -58
  216. data/doc/classes/LongMath.src/M000151.html +0 -406
  217. data/doc/classes/LongMath.src/M000152.html +0 -63
  218. data/doc/classes/LongMath.src/M000153.html +0 -117
  219. data/doc/classes/LongMath.src/M000154.html +0 -150
  220. data/doc/classes/LongMath.src/M000155.html +0 -63
  221. data/doc/classes/LongMath.src/M000156.html +0 -18
  222. data/doc/classes/LongMath.src/M000157.html +0 -19
  223. data/doc/classes/LongMath.src/M000158.html +0 -18
  224. data/doc/classes/LongMath.src/M000159.html +0 -19
  225. data/doc/classes/LongMath/CacheKey.html +0 -164
  226. data/doc/classes/LongMath/CacheKey.src/M000140.html +0 -36
  227. data/doc/classes/LongMath/CacheKey.src/M000145.html +0 -36
  228. data/doc/classes/LongMath/CacheKey.src/M000147.html +0 -36
  229. data/doc/classes/LongMath/CacheKey.src/M000149.html +0 -36
  230. data/doc/classes/LongMath/CacheKey.src/M000155.html +0 -36
  231. data/doc/classes/LongMath/CacheKey.src/M000160.html +0 -36
  232. data/doc/classes/Numeric.html +0 -177
  233. data/doc/classes/Numeric.src/M000100.html +0 -23
  234. data/doc/classes/Numeric.src/M000102.html +0 -23
  235. data/doc/classes/Numeric.src/M000103.html +0 -18
  236. data/doc/classes/Numeric.src/M000104.html +0 -23
  237. data/doc/classes/Numeric.src/M000105.html +0 -23
  238. data/doc/classes/Numeric.src/M000106.html +0 -18
  239. data/doc/classes/Numeric.src/M000110.html +0 -23
  240. data/doc/classes/Numeric.src/M000111.html +0 -18
  241. data/doc/classes/Rational.html +0 -161
  242. data/doc/classes/Rational.src/M000101.html +0 -23
  243. data/doc/classes/Rational.src/M000103.html +0 -23
  244. data/doc/classes/Rational.src/M000104.html +0 -23
  245. data/doc/classes/Rational.src/M000106.html +0 -23
  246. data/doc/classes/Rational.src/M000107.html +0 -23
  247. data/doc/classes/Rational.src/M000112.html +0 -23
  248. data/doc/created.rid +0 -1
  249. data/doc/dot/f_0.dot +0 -166
  250. data/doc/dot/f_0.png +0 -0
  251. data/doc/dot/m_0_0.dot +0 -59
  252. data/doc/dot/m_0_0.png +0 -0
  253. data/doc/dot/m_0_1.dot +0 -62
  254. data/doc/dot/m_0_1.png +0 -0
  255. data/doc/files/lib/long-decimal_rb.html +0 -191
  256. data/doc/files/lib/long-decimal_rb.src/M000001.html +0 -22
  257. data/doc/files/lib/long-decimal_rb.src/M000002.html +0 -18
  258. data/doc/fr_class_index.html +0 -37
  259. data/doc/fr_file_index.html +0 -27
  260. data/doc/fr_method_index.html +0 -192
  261. data/doc/index.html +0 -24
  262. data/doc/rdoc-style.css +0 -208
data/lib/long-decimal.rb CHANGED
@@ -1,8 +1,12 @@
1
1
  #
2
2
  # long-decimal.rb -- Arbitrary precision decimals with fixed decimal point
3
3
  #
4
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.50 2007/07/12 20:46:59 bk1 Exp $
5
- # CVS-Label: $Name: ALPHA_01_02 $
4
+ # This class contains the basic functionality for working with LongDecimal
5
+ # additional functionality, mostly transcendental functions,
6
+ # may be found in long-decimal-extra.rb
7
+ #
8
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.51 2007/08/19 19:23:32 bk1 Exp $
9
+ # CVS-Label: $Name: ALPHA_01_03 $
6
10
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
11
  #
8
12
  require "complex"
@@ -312,7 +316,7 @@ end
312
316
  # common base class for LongDecimal and LongDecimalQuot
313
317
  #
314
318
  class LongDecimalBase < Numeric
315
- @RCS_ID='-$Id: long-decimal.rb,v 1.50 2007/07/12 20:46:59 bk1 Exp $-'
319
+ @RCS_ID='-$Id: long-decimal.rb,v 1.51 2007/08/19 19:23:32 bk1 Exp $-'
316
320
 
317
321
  include LongDecimalRoundingMode
318
322
 
@@ -420,7 +424,7 @@ end # class LongDecimalBase
420
424
  # digits and the other one the position of the decimal point.
421
425
  #
422
426
  class LongDecimal < LongDecimalBase
423
- @RCS_ID='-$Id: long-decimal.rb,v 1.50 2007/07/12 20:46:59 bk1 Exp $-'
427
+ @RCS_ID='-$Id: long-decimal.rb,v 1.51 2007/08/19 19:23:32 bk1 Exp $-'
424
428
 
425
429
  # MINUS_ONE = LongDecimal(-1)
426
430
  # ZERO = LongDecimal(0)
@@ -709,8 +713,8 @@ class LongDecimal < LongDecimalBase
709
713
  # use, zero_rounding_mode has to be used
710
714
  # to decide.
711
715
  #
712
- def round_to_allowed_remainders(new_scale,
713
- remainders,
716
+ def round_to_allowed_remainders(new_scale,
717
+ remainders,
714
718
  modulus,
715
719
  rounding_mode = LongDecimalRoundingMode::ROUND_UNNECESSARY,
716
720
  zero_rounding_mode = LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)
@@ -731,11 +735,11 @@ class LongDecimal < LongDecimalBase
731
735
  elsif @scale > new_scale
732
736
  factor = 10**(@scale - new_scale)
733
737
  remainders = remainders.collect do |r|
734
- r * factor
738
+ r * factor
735
739
  end
736
740
  modulus *= factor
737
741
  end
738
-
742
+
739
743
  int_val_2 = @int_val.round_to_allowed_remainders(remainders, modulus, rounding_mode, zero_rounding_mode)
740
744
  self_2 = LongDecimal.new(int_val_2, @scale)
741
745
 
@@ -1538,7 +1542,7 @@ end # LongDecimal
1538
1542
  #
1539
1543
  class LongDecimalQuot < LongDecimalBase
1540
1544
 
1541
- @RCS_ID='-$Id: long-decimal.rb,v 1.50 2007/07/12 20:46:59 bk1 Exp $-'
1545
+ @RCS_ID='-$Id: long-decimal.rb,v 1.51 2007/08/19 19:23:32 bk1 Exp $-'
1542
1546
 
1543
1547
  #
1544
1548
  # constructor
@@ -2661,28 +2665,6 @@ module LongMath
2661
2665
  exp_internal(x, prec, mode)
2662
2666
  end
2663
2667
 
2664
- #
2665
- # calc the base-2-exponential function of x to the given precision as
2666
- # LongDecimal. Only supports values of x such that the result still
2667
- # fits into a float (x <= 709). This limitation is somewhat
2668
- # arbitrary, but it is enforced in order to avoid producing numbers
2669
- # with the exponential function that exceed the memory.
2670
- #
2671
- def LongMath.exp2(x, prec, mode = LongMath.standard_mode) # down?
2672
- LongMath.power(2, x, prec, mode)
2673
- end
2674
-
2675
- #
2676
- # calc the base-10-exponential function of x to the given precision as
2677
- # LongDecimal. Only supports values of x such that the result still
2678
- # fits into a float (x <= 709). This limitation is somewhat
2679
- # arbitrary, but it is enforced in order to avoid producing numbers
2680
- # with the exponential function that exceed the memory.
2681
- #
2682
- def LongMath.exp10(x, prec, mode = LongMath.standard_mode) # down?
2683
- LongMath.power(10, x, prec, mode)
2684
- end
2685
-
2686
2668
  private
2687
2669
 
2688
2670
  #
@@ -2917,53 +2899,6 @@ module LongMath
2917
2899
  log_internal(x, prec, mode)
2918
2900
  end
2919
2901
 
2920
- #
2921
- # calculate the base 10 logarithm of x to the given precision as
2922
- # LongDecimal.
2923
- #
2924
- def LongMath.log10(x, prec, mode = LongMath.standard_mode) # down?
2925
-
2926
- check_is_prec(prec, "prec")
2927
- check_is_mode(mode, "mode")
2928
- iprec = prec + 6
2929
- unless (x.kind_of? LongDecimal)
2930
- x = x.to_ld(iprec, mode)
2931
- end
2932
- if (x.one?) then
2933
- return LongDecimal.zero!(prec)
2934
- end
2935
-
2936
- id = x.int_digits10
2937
- xx = x.move_point_left(id)
2938
- lnxx = log_internal(xx, iprec, mode)
2939
- ln10 = log_internal(10, iprec, mode)
2940
- y = id + (lnxx / ln10).round_to_scale(prec, mode)
2941
- return y
2942
- end
2943
-
2944
- #
2945
- # calculate the base 2 logarithm of x to the given precision as
2946
- # LongDecimal.
2947
- #
2948
- def LongMath.log2(x, prec, mode = LongMath.standard_mode)
2949
-
2950
- check_is_prec(prec, "prec")
2951
- check_is_mode(mode, "mode")
2952
- iprec = prec + 6
2953
- unless (x.kind_of? LongDecimal)
2954
- x = x.to_ld(iprec, mode)
2955
- end
2956
- if (x.one?) then
2957
- return LongDecimal.zero!(prec)
2958
- end
2959
- id = x.int_digits2
2960
- xx = (x / (1 << id)).round_to_scale(x.scale+id)
2961
- lnxx = log_internal(xx, iprec, mode)
2962
- ln2 = log_internal(2.to_ld, iprec, mode)
2963
- y = id + (lnxx / ln2).round_to_scale(prec, mode)
2964
- return y
2965
- end
2966
-
2967
2902
  #
2968
2903
  # internal functionality of log. exposes some more parameters, that
2969
2904
  # should usually be set to defaut values, in order to allow better testing.
@@ -3103,287 +3038,287 @@ module LongMath
3103
3038
  return y
3104
3039
  end
3105
3040
 
3106
- private
3107
-
3108
- #
3109
- # internal helper method for calculating the internal precision for power
3110
- #
3111
- def LongMath.calc_iprec_for_power(x, y, prec)
3112
-
3113
- logx_f = nil
3114
- if (x.abs <= LongMath::MAX_FLOATABLE)
3115
- x_f = x.to_f
3116
- logx_f = Math.log(x_f.abs)
3117
- else
3118
- logx_f = LongMath.log(x, 15, LongMath::ROUND_UP)
3119
- end
3120
-
3121
- y_f = nil
3122
- if (y.abs <= LongMath::MAX_FLOATABLE) then
3123
- y_f = y.to_f
3124
- else
3125
- y_f = y.round_to_scale(15, LongMath::ROUND_UP)
3126
- end
3127
-
3128
- logx_y_f = logx_f * y_f
3129
- if (logx_y_f.abs > LongMath::MAX_FLOATABLE) then
3130
- raise ArgumentError, "power would be way too big: y*log(x)=#{logx_y_f}";
3131
- end
3132
- logx_y_f = logx_y_f.to_f unless logx_y_f.kind_of? Float
3133
-
3134
- iprec_x = calc_iprec_for_exp(logx_y_f.abs.ceil, prec, logx_y_f < 0)
3135
- iprec_y = iprec_x
3136
- iprec = iprec_x + 2
3137
- if (logx_f < 0)
3138
- iprec_x -= (logx_f/LOG10).round
3139
- end
3140
- if (y_f.abs < 1)
3141
- logy_f = nil
3142
- if (y_f.kind_of? Float) then
3143
- logy_f = Math.log(y_f.abs)
3144
- else
3145
- logy_f = LongMath.log(y_f.abs, 15, LongMath::ROUND_UP)
3146
- if (logy_f.abs > LongMath::MAX_FLOATABLE) then
3147
- raise ArgumentError, "exponent would be way too big: y=#{y} logy_f=#{logy_f}";
3148
- end
3149
- logy_f = logy_f.to_f
3150
- end
3151
- # puts("x=#{x} y=#{y} x_f=#{x_f} y_f=#{y_f} logx_f=#{logx_f} logy_f=#{logy_f} logx_y_f=#{logx_y_f}\n")
3152
- iprec_y -= (logy_f/LOG10).round
3153
- end
3154
- # puts("x=#{x} y=#{y} x_f=#{x_f} y_f=#{y_f} logx_f=#{logx_f} logy_f=#{logy_f} logx_y_f=#{logx_y_f}\n")
3155
- # puts("\niprec: x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y}\n")
3156
- [ iprec, iprec_x, iprec_y, logx_y_f ]
3157
-
3158
- end
3159
-
3160
- public
3161
-
3162
- #
3163
- # calc the power of x with exponent y to the given precision as
3164
- # LongDecimal. Only supports values of y such that exp(y) still
3165
- # fits into a float (y <= 709)
3166
- #
3167
- def LongMath.power(x, y, prec, mode = LongMath.standard_mode)
3168
-
3169
- raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
3170
- raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
3171
- raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
3172
- raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
3173
- # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
3174
- # raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?
3175
- raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
3176
- check_is_prec(prec, "prec")
3177
- check_is_mode(mode, "mode")
3178
-
3179
- # handle the special cases where base or exponent are 0 or 1 explicitely
3180
- if y.zero? then
3181
- return LongDecimal.one!(prec)
3182
- elsif x.zero? then
3183
- return LongDecimal.zero!(prec)
3184
- elsif y.one? then
3185
- return x.to_ld(prec, mode)
3186
- elsif x.one? then
3187
- return LongDecimal.one!(prec)
3188
- end
3189
-
3190
- # els
3191
- # could be result with our precision
3192
- # x ** y <= 10**-s/2 <=> y * log(x) <= -s log(10) - log(2)
3193
-
3194
- iprec, iprec_x, iprec_y, logx_y_f = calc_iprec_for_power(x, y, prec)
3195
- if (x < 1 && y > 0 || x > 1 && y < 0) then
3196
- if (logx_y_f <= - prec * LOG10 - LOG2) then
3197
- return LongDecimal.zero!(prec)
3198
- end
3199
- end
3200
- # puts("x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y} prec=#{prec}")
3201
-
3202
- unless (x.kind_of? LongDecimalBase) || (x.kind_of? Integer)
3203
- x = x.to_ld(iprec_x, mode)
3204
- end
3205
- unless (y.kind_of? LongDecimalBase) || (y.kind_of? Integer)
3206
- y = y.to_ld(iprec_y, mode)
3207
- end
3208
-
3209
- # try shortcut if exponent is an integer
3210
- if (y.kind_of? LongDecimalBase) && y.is_int? then
3211
- y = y.to_i
3212
- end
3213
- unless (y.kind_of? Integer)
3214
- y2 = y*2
3215
- if (y2.kind_of? LongDecimalBase) && y2.is_int? then
3216
- y2 = y2.to_i
3217
- puts("y2=#{y2}")
3218
- end
3219
- if (y2.kind_of? Integer)
3220
- x = LongMath.sqrt(x, 2*iprec_x, mode)
3221
- y = y2
3222
- end
3223
- end
3224
- if (y.kind_of? Integer)
3225
- unless x.kind_of? LongDecimal
3226
- # x = x.to_ld(prec)
3227
- x = x.to_ld(iprec_x)
3228
- end
3229
- # z = x ** y
3230
- z = LongMath.ipower(x, y, 2*iprec, mode)
3231
- # puts("x=#{x} y=#{y} z=#{z} y int")
3232
- return z.to_ld(prec, mode)
3233
- end
3041
+ # private
3234
3042
 
3235
- # it can be assumed that the exponent is not an integer, so it should
3236
- # be converted into LongDecimal
3237
- unless (y.kind_of? LongDecimal)
3238
- # y = y.to_ld(prec, mode)
3239
- y = y.to_ld(iprec_y, mode)
3240
- end
3043
+ # #
3044
+ # # internal helper method for calculating the internal precision for power
3045
+ # #
3046
+ # def LongMath.calc_iprec_for_power(x, y, prec)
3241
3047
 
3242
- # if x < 1 && y < 0 then
3243
- # working with x < 1 should be improved, less precision needed
3244
- if x < 1 then
3245
- # since we do not allow x < 0 and we have handled x = 0 already,
3246
- # we can be sure that x is no integer, so it has been converted
3247
- # if necessary to LongDecimalBase
3248
- y = -y
3249
- x = (1/x).round_to_scale(iprec_x*2, mode)
3250
- iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
3251
- end
3048
+ # logx_f = nil
3049
+ # if (x.abs <= LongMath::MAX_FLOATABLE)
3050
+ # x_f = x.to_f
3051
+ # logx_f = Math.log(x_f.abs)
3052
+ # else
3053
+ # logx_f = LongMath.log(x, 15, LongMath::ROUND_UP)
3054
+ # end
3252
3055
 
3253
- # exponent is split in two parts, an integer part and a
3254
- # LongDecimal with absolute value <= 0.5
3255
- y0 = y.round_to_scale(0, LongMath.standard_imode).to_i
3256
- # z0 = x**y0
3257
- z0 = LongMath.ipower(x, y0, 2*iprec, mode)
3258
- y1 = y - y0
3259
- prec_extra = 0
3260
- if (y0 > 0)
3261
- prec_extra = (y0*Math.log10(x.to_f).abs).ceil
3262
- end
3263
- # z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
3264
- z1 = LongMath.power_internal(x, y1, prec+prec_extra + 4, mode)
3265
- z = z0 * z1
3266
- # puts("x=#{x} y=#{y} z=#{z} y not int")
3267
- return z.to_ld(prec, mode)
3268
- end
3056
+ # y_f = nil
3057
+ # if (y.abs <= LongMath::MAX_FLOATABLE) then
3058
+ # y_f = y.to_f
3059
+ # else
3060
+ # y_f = y.round_to_scale(15, LongMath::ROUND_UP)
3061
+ # end
3269
3062
 
3270
- #
3271
- # internal functionality to calculate the y-th power of x assuming
3272
- # that y is an integer
3273
- # prec is a hint on how much internal precision is needed at most
3274
- # final rounding is left to the caller
3275
- #
3276
- def LongMath.ipower(x, y, prec, mode)
3063
+ # logx_y_f = logx_f * y_f
3064
+ # if (logx_y_f.abs > LongMath::MAX_FLOATABLE) then
3065
+ # raise ArgumentError, "power would be way too big: y*log(x)=#{logx_y_f}";
3066
+ # end
3067
+ # logx_y_f = logx_y_f.to_f unless logx_y_f.kind_of? Float
3277
3068
 
3278
- raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
3279
- raise TypeError, "y=#{y} must be integer" unless y.kind_of? Integer
3280
- raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
3281
- raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
3282
- check_is_prec(prec, "prec")
3283
- check_is_mode(mode, "mode")
3069
+ # iprec_x = calc_iprec_for_exp(logx_y_f.abs.ceil, prec, logx_y_f < 0)
3070
+ # iprec_y = iprec_x
3071
+ # iprec = iprec_x + 2
3072
+ # if (logx_f < 0)
3073
+ # iprec_x -= (logx_f/LOG10).round
3074
+ # end
3075
+ # if (y_f.abs < 1)
3076
+ # logy_f = nil
3077
+ # if (y_f.kind_of? Float) then
3078
+ # logy_f = Math.log(y_f.abs)
3079
+ # else
3080
+ # logy_f = LongMath.log(y_f.abs, 15, LongMath::ROUND_UP)
3081
+ # if (logy_f.abs > LongMath::MAX_FLOATABLE) then
3082
+ # raise ArgumentError, "exponent would be way too big: y=#{y} logy_f=#{logy_f}";
3083
+ # end
3084
+ # logy_f = logy_f.to_f
3085
+ # end
3086
+ # # puts("x=#{x} y=#{y} x_f=#{x_f} y_f=#{y_f} logx_f=#{logx_f} logy_f=#{logy_f} logx_y_f=#{logx_y_f}\n")
3087
+ # iprec_y -= (logy_f/LOG10).round
3088
+ # end
3089
+ # # puts("x=#{x} y=#{y} x_f=#{x_f} y_f=#{y_f} logx_f=#{logx_f} logy_f=#{logy_f} logx_y_f=#{logx_y_f}\n")
3090
+ # # puts("\niprec: x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y}\n")
3091
+ # [ iprec, iprec_x, iprec_y, logx_y_f ]
3092
+
3093
+ # end
3094
+
3095
+ # public
3096
+
3097
+ # #
3098
+ # # calc the power of x with exponent y to the given precision as
3099
+ # # LongDecimal. Only supports values of y such that exp(y) still
3100
+ # # fits into a float (y <= 709)
3101
+ # #
3102
+ # def LongMath.power(x, y, prec, mode = LongMath.standard_mode)
3103
+
3104
+ # raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
3105
+ # raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
3106
+ # raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
3107
+ # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
3108
+ # # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
3109
+ # # raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?
3110
+ # raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
3111
+ # check_is_prec(prec, "prec")
3112
+ # check_is_mode(mode, "mode")
3113
+
3114
+ # # handle the special cases where base or exponent are 0 or 1 explicitely
3115
+ # if y.zero? then
3116
+ # return LongDecimal.one!(prec)
3117
+ # elsif x.zero? then
3118
+ # return LongDecimal.zero!(prec)
3119
+ # elsif y.one? then
3120
+ # return x.to_ld(prec, mode)
3121
+ # elsif x.one? then
3122
+ # return LongDecimal.one!(prec)
3123
+ # end
3284
3124
 
3285
- cnt = 0
3125
+ # # els
3126
+ # # could be result with our precision
3127
+ # # x ** y <= 10**-s/2 <=> y * log(x) <= -s log(10) - log(2)
3286
3128
 
3287
- if (y.zero?)
3288
- return 1
3289
- elsif ! (x.kind_of? LongDecimalBase) || x.scale * y.abs <= prec
3290
- return x ** y
3291
- elsif (y < 0)
3292
- l = Math.log10(x.abs.to_f)
3293
- if (l > 0)
3294
- prec += (2*l).ceil
3295
- end
3296
- return 1/LongMath.ipower(x, -y, prec, mode)
3297
- else
3298
- # y > 0
3299
- # puts("ipower y>0 x=#{x} y=#{y} prec=#{prec}")
3300
- z = x
3301
- while true do
3302
-
3303
- cnt++
3304
- y -= 1
3305
- if (y.zero?)
3306
- break
3307
- end
3308
- while (y & 0x01) == 0 do
3129
+ # iprec, iprec_x, iprec_y, logx_y_f = calc_iprec_for_power(x, y, prec)
3130
+ # if (x < 1 && y > 0 || x > 1 && y < 0) then
3131
+ # if (logx_y_f <= - prec * LOG10 - LOG2) then
3132
+ # return LongDecimal.zero!(prec)
3133
+ # end
3134
+ # end
3135
+ # # puts("x=#{x} y=#{y} iprec=#{iprec} iprec_x=#{iprec_x} iprec_y=#{iprec_y} prec=#{prec}")
3309
3136
 
3310
- cnt++
3311
- y = y >> 1
3312
- x = (x*x)
3313
- if (x.kind_of? LongDecimalBase)
3314
- x = x.round_to_scale(prec, mode)
3315
- end
3316
- if (cnt > 1000)
3317
- puts("ipower x=#{x} y=#{y} cnt=#{cnt} z=#{z}")
3318
- cnt = 0
3319
- end
3137
+ # unless (x.kind_of? LongDecimalBase) || (x.kind_of? Integer)
3138
+ # x = x.to_ld(iprec_x, mode)
3139
+ # end
3140
+ # unless (y.kind_of? LongDecimalBase) || (y.kind_of? Integer)
3141
+ # y = y.to_ld(iprec_y, mode)
3142
+ # end
3320
3143
 
3321
- end
3322
- z = (z*x)
3323
- if (z.kind_of? LongDecimalBase)
3324
- z = z.round_to_scale(prec, mode)
3325
- end
3144
+ # # try shortcut if exponent is an integer
3145
+ # if (y.kind_of? LongDecimalBase) && y.is_int? then
3146
+ # y = y.to_i
3147
+ # end
3148
+ # unless (y.kind_of? Integer)
3149
+ # y2 = y*2
3150
+ # if (y2.kind_of? LongDecimalBase) && y2.is_int? then
3151
+ # y2 = y2.to_i
3152
+ # puts("y2=#{y2}")
3153
+ # end
3154
+ # if (y2.kind_of? Integer)
3155
+ # x = LongMath.sqrt(x, 2*iprec_x, mode)
3156
+ # y = y2
3157
+ # end
3158
+ # end
3159
+ # if (y.kind_of? Integer)
3160
+ # unless x.kind_of? LongDecimal
3161
+ # # x = x.to_ld(prec)
3162
+ # x = x.to_ld(iprec_x)
3163
+ # end
3164
+ # # z = x ** y
3165
+ # z = LongMath.ipower(x, y, 2*iprec, mode)
3166
+ # # puts("x=#{x} y=#{y} z=#{z} y int")
3167
+ # return z.to_ld(prec, mode)
3168
+ # end
3326
3169
 
3327
- end
3328
- end
3329
- return z
3330
- end
3170
+ # # it can be assumed that the exponent is not an integer, so it should
3171
+ # # be converted into LongDecimal
3172
+ # unless (y.kind_of? LongDecimal)
3173
+ # # y = y.to_ld(prec, mode)
3174
+ # y = y.to_ld(iprec_y, mode)
3175
+ # end
3331
3176
 
3332
- #
3333
- # internal functionality of exp. exposes some more parameters, that
3334
- # should usually be set to defaut values, in order to allow better testing.
3335
- # do not actually call this method unless you are testing exp.
3336
- # create a bug report, if the default settings for the parameters do
3337
- # not work correctly
3338
- #
3339
- def LongMath.power_internal(x, y, prec = nil, final_mode = LongMath.standard_mode, iprec = nil, mode = LongMath.standard_imode)
3177
+ # # if x < 1 && y < 0 then
3178
+ # # working with x < 1 should be improved, less precision needed
3179
+ # if x < 1 then
3180
+ # # since we do not allow x < 0 and we have handled x = 0 already,
3181
+ # # we can be sure that x is no integer, so it has been converted
3182
+ # # if necessary to LongDecimalBase
3183
+ # y = -y
3184
+ # x = (1/x).round_to_scale(iprec_x*2, mode)
3185
+ # iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
3186
+ # end
3340
3187
 
3341
- if (prec.nil?) then
3342
- if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
3343
- prec = [x.scale, y.scale].max
3344
- elsif (x.kind_of? LongDecimalBase)
3345
- prec = x.scale
3346
- elsif (y.kind_of? LongDecimalBase)
3347
- prec = y.scale
3348
- else
3349
- raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
3350
- end
3351
- end
3352
- check_is_prec(prec, "prec")
3188
+ # # exponent is split in two parts, an integer part and a
3189
+ # # LongDecimal with absolute value <= 0.5
3190
+ # y0 = y.round_to_scale(0, LongMath.standard_imode).to_i
3191
+ # # z0 = x**y0
3192
+ # z0 = LongMath.ipower(x, y0, 2*iprec, mode)
3193
+ # y1 = y - y0
3194
+ # prec_extra = 0
3195
+ # if (y0 > 0)
3196
+ # prec_extra = (y0*Math.log10(x.to_f).abs).ceil
3197
+ # end
3198
+ # # z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
3199
+ # z1 = LongMath.power_internal(x, y1, prec+prec_extra + 4, mode)
3200
+ # z = z0 * z1
3201
+ # # puts("x=#{x} y=#{y} z=#{z} y not int")
3202
+ # return z.to_ld(prec, mode)
3203
+ # end
3204
+
3205
+ # #
3206
+ # # internal functionality to calculate the y-th power of x assuming
3207
+ # # that y is an integer
3208
+ # # prec is a hint on how much internal precision is needed at most
3209
+ # # final rounding is left to the caller
3210
+ # #
3211
+ # def LongMath.ipower(x, y, prec, mode)
3212
+
3213
+ # raise TypeError, "x=#{x} must be numeric" unless x.kind_of? Numeric
3214
+ # raise TypeError, "y=#{y} must be integer" unless y.kind_of? Integer
3215
+ # raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x.abs <= MAX_FLOATABLE
3216
+ # raise TypeError, "y=#{y.inspect} must not be greater #{MAX_FLOATABLE}" unless y.abs <= MAX_FLOATABLE
3217
+ # check_is_prec(prec, "prec")
3218
+ # check_is_mode(mode, "mode")
3219
+
3220
+ # cnt = 0
3221
+
3222
+ # if (y.zero?)
3223
+ # return 1
3224
+ # elsif ! (x.kind_of? LongDecimalBase) || x.scale * y.abs <= prec
3225
+ # return x ** y
3226
+ # elsif (y < 0)
3227
+ # l = Math.log10(x.abs.to_f)
3228
+ # if (l > 0)
3229
+ # prec += (2*l).ceil
3230
+ # end
3231
+ # return 1/LongMath.ipower(x, -y, prec, mode)
3232
+ # else
3233
+ # # y > 0
3234
+ # # puts("ipower y>0 x=#{x} y=#{y} prec=#{prec}")
3235
+ # z = x
3236
+ # while true do
3237
+
3238
+ # cnt++
3239
+ # y -= 1
3240
+ # if (y.zero?)
3241
+ # break
3242
+ # end
3243
+ # while (y & 0x01) == 0 do
3244
+
3245
+ # cnt++
3246
+ # y = y >> 1
3247
+ # x = (x*x)
3248
+ # if (x.kind_of? LongDecimalBase)
3249
+ # x = x.round_to_scale(prec, mode)
3250
+ # end
3251
+ # if (cnt > 1000)
3252
+ # puts("ipower x=#{x} y=#{y} cnt=#{cnt} z=#{z}")
3253
+ # cnt = 0
3254
+ # end
3255
+
3256
+ # end
3257
+ # z = (z*x)
3258
+ # if (z.kind_of? LongDecimalBase)
3259
+ # z = z.round_to_scale(prec, mode)
3260
+ # end
3261
+
3262
+ # end
3263
+ # end
3264
+ # return z
3265
+ # end
3266
+
3267
+ # #
3268
+ # # internal functionality of exp. exposes some more parameters, that
3269
+ # # should usually be set to defaut values, in order to allow better testing.
3270
+ # # do not actually call this method unless you are testing exp.
3271
+ # # create a bug report, if the default settings for the parameters do
3272
+ # # not work correctly
3273
+ # #
3274
+ # def LongMath.power_internal(x, y, prec = nil, final_mode = LongMath.standard_mode, iprec = nil, mode = LongMath.standard_imode)
3275
+
3276
+ # if (prec.nil?) then
3277
+ # if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
3278
+ # prec = [x.scale, y.scale].max
3279
+ # elsif (x.kind_of? LongDecimalBase)
3280
+ # prec = x.scale
3281
+ # elsif (y.kind_of? LongDecimalBase)
3282
+ # prec = y.scale
3283
+ # else
3284
+ # raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
3285
+ # end
3286
+ # end
3287
+ # check_is_prec(prec, "prec")
3353
3288
 
3354
- if (final_mode.nil?)
3355
- final_mode = LongMath.standard_mode
3356
- end
3357
- check_is_mode(final_mode, "final_mode")
3358
- check_is_mode(mode, "mode")
3289
+ # if (final_mode.nil?)
3290
+ # final_mode = LongMath.standard_mode
3291
+ # end
3292
+ # check_is_mode(final_mode, "final_mode")
3293
+ # check_is_mode(mode, "mode")
3359
3294
 
3360
- if y.zero? then
3361
- return LongDecimal.one!(prec)
3362
- elsif x.zero? then
3363
- return LongDecimal.zero!(prec)
3364
- end
3295
+ # if y.zero? then
3296
+ # return LongDecimal.one!(prec)
3297
+ # elsif x.zero? then
3298
+ # return LongDecimal.zero!(prec)
3299
+ # end
3365
3300
 
3366
- if (iprec.nil?) then
3367
- iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
3368
- end
3369
- unless (x.kind_of? LongDecimal)
3370
- # x = x.to_ld(iprec, mode)
3371
- x = x.to_ld(iprec_x, mode)
3372
- end
3373
- unless (y.kind_of? LongDecimal)
3374
- # y = y.to_ld(iprec, mode)
3375
- y = y.to_ld(iprec_y, mode)
3376
- end
3301
+ # if (iprec.nil?) then
3302
+ # iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
3303
+ # end
3304
+ # unless (x.kind_of? LongDecimal)
3305
+ # # x = x.to_ld(iprec, mode)
3306
+ # x = x.to_ld(iprec_x, mode)
3307
+ # end
3308
+ # unless (y.kind_of? LongDecimal)
3309
+ # # y = y.to_ld(iprec, mode)
3310
+ # y = y.to_ld(iprec_y, mode)
3311
+ # end
3377
3312
 
3378
- # logx = log(x, iprec, mode)
3379
- logx = log(x, iprec + 20, mode)
3380
- logx_y = logx*y
3381
- # xy = exp_internal(logx_y, prec + 1, mode)
3382
- # xy = exp_internal(logx_y, prec + 4, mode)
3383
- xy = exp_internal(logx_y, prec + 3, mode)
3384
- xy.round_to_scale(prec, final_mode)
3313
+ # # logx = log(x, iprec, mode)
3314
+ # logx = log(x, iprec + 20, mode)
3315
+ # logx_y = logx*y
3316
+ # # xy = exp_internal(logx_y, prec + 1, mode)
3317
+ # # xy = exp_internal(logx_y, prec + 4, mode)
3318
+ # xy = exp_internal(logx_y, prec + 3, mode)
3319
+ # xy.round_to_scale(prec, final_mode)
3385
3320
 
3386
- end # power_internal
3321
+ # end # power_internal
3387
3322
 
3388
3323
  @@standard_mode = ROUND_HALF_UP
3389
3324