long-decimal 0.00.17 → 0.00.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. data/README +10 -8
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/doc/classes/LongDecimal.html +1 -1
  5. data/doc/classes/LongDecimal.src/M000041.html +4 -0
  6. data/doc/classes/LongDecimal.src/M000042.html +1 -1
  7. data/doc/classes/LongDecimal.src/M000043.html +1 -1
  8. data/doc/classes/LongDecimal.src/M000044.html +1 -1
  9. data/doc/classes/LongDecimal.src/M000045.html +1 -1
  10. data/doc/classes/LongDecimal.src/M000046.html +1 -1
  11. data/doc/classes/LongDecimal.src/M000047.html +10 -6
  12. data/doc/classes/LongDecimal.src/M000048.html +1 -1
  13. data/doc/classes/LongDecimal.src/M000049.html +1 -1
  14. data/doc/classes/LongDecimal.src/M000050.html +1 -1
  15. data/doc/classes/LongDecimal.src/M000051.html +1 -1
  16. data/doc/classes/LongDecimal.src/M000052.html +1 -1
  17. data/doc/classes/LongDecimal.src/M000053.html +1 -1
  18. data/doc/classes/LongDecimal.src/M000054.html +1 -1
  19. data/doc/classes/LongDecimal.src/M000055.html +1 -1
  20. data/doc/classes/LongDecimal.src/M000056.html +1 -1
  21. data/doc/classes/LongDecimal.src/M000058.html +1 -1
  22. data/doc/classes/LongDecimal.src/M000059.html +1 -1
  23. data/doc/classes/LongDecimal.src/M000060.html +1 -1
  24. data/doc/classes/LongDecimal.src/M000061.html +1 -1
  25. data/doc/classes/LongDecimal.src/M000062.html +1 -1
  26. data/doc/classes/LongDecimal.src/M000063.html +1 -1
  27. data/doc/classes/LongDecimal.src/M000064.html +1 -1
  28. data/doc/classes/LongDecimal.src/M000065.html +1 -1
  29. data/doc/classes/LongDecimal.src/M000066.html +1 -1
  30. data/doc/classes/LongDecimal.src/M000067.html +1 -1
  31. data/doc/classes/LongDecimal.src/M000068.html +1 -1
  32. data/doc/classes/LongDecimal.src/M000069.html +1 -1
  33. data/doc/classes/LongDecimal.src/M000070.html +1 -1
  34. data/doc/classes/LongDecimal.src/M000071.html +1 -1
  35. data/doc/classes/LongDecimal.src/M000072.html +1 -1
  36. data/doc/classes/LongDecimal.src/M000073.html +1 -1
  37. data/doc/classes/LongDecimal.src/M000074.html +1 -1
  38. data/doc/classes/LongDecimal.src/M000075.html +1 -1
  39. data/doc/classes/LongDecimal.src/M000076.html +1 -1
  40. data/doc/classes/LongDecimal.src/M000077.html +1 -1
  41. data/doc/classes/LongDecimal.src/M000078.html +1 -1
  42. data/doc/classes/LongDecimal.src/M000079.html +1 -1
  43. data/doc/classes/LongDecimal.src/M000080.html +1 -1
  44. data/doc/classes/LongDecimal.src/M000081.html +1 -1
  45. data/doc/classes/LongDecimal.src/M000082.html +1 -1
  46. data/doc/classes/LongDecimal.src/M000083.html +1 -1
  47. data/doc/classes/LongDecimal.src/M000084.html +1 -1
  48. data/doc/classes/LongDecimal.src/M000085.html +1 -1
  49. data/doc/classes/LongDecimal.src/M000086.html +1 -1
  50. data/doc/classes/LongDecimal.src/M000087.html +1 -1
  51. data/doc/classes/LongDecimal.src/M000088.html +1 -1
  52. data/doc/classes/LongDecimal.src/M000089.html +1 -1
  53. data/doc/classes/LongDecimal.src/M000090.html +1 -1
  54. data/doc/classes/LongDecimal.src/M000091.html +1 -1
  55. data/doc/classes/LongDecimal.src/M000094.html +1 -1
  56. data/doc/classes/LongDecimal.src/M000095.html +1 -1
  57. data/doc/classes/LongDecimal.src/M000096.html +1 -1
  58. data/doc/classes/LongDecimal.src/M000097.html +1 -1
  59. data/doc/classes/LongDecimal.src/M000098.html +1 -1
  60. data/doc/classes/LongDecimal.src/M000099.html +1 -1
  61. data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
  62. data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
  63. data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
  64. data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
  65. data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
  66. data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
  67. data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
  68. data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
  69. data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
  70. data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
  71. data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
  72. data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
  73. data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
  74. data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
  75. data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
  76. data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
  77. data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
  78. data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
  79. data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
  80. data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
  81. data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
  82. data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
  83. data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
  84. data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
  85. data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
  86. data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
  87. data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
  88. data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
  89. data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
  90. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +5 -5
  91. data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000138.html +22 -0
  92. data/doc/classes/LongMath.html +83 -55
  93. data/doc/classes/LongMath.src/M000113.html +1 -1
  94. data/doc/classes/LongMath.src/M000114.html +1 -1
  95. data/doc/classes/LongMath.src/M000115.html +1 -1
  96. data/doc/classes/LongMath.src/M000116.html +1 -1
  97. data/doc/classes/LongMath.src/M000117.html +1 -1
  98. data/doc/classes/LongMath.src/M000118.html +1 -1
  99. data/doc/classes/LongMath.src/M000119.html +1 -1
  100. data/doc/classes/LongMath.src/M000120.html +1 -1
  101. data/doc/classes/LongMath.src/M000121.html +1 -1
  102. data/doc/classes/LongMath.src/M000122.html +1 -1
  103. data/doc/classes/LongMath.src/M000123.html +1 -1
  104. data/doc/classes/LongMath.src/M000124.html +1 -1
  105. data/doc/classes/LongMath.src/M000125.html +1 -1
  106. data/doc/classes/LongMath.src/M000126.html +1 -1
  107. data/doc/classes/LongMath.src/M000127.html +2 -2
  108. data/doc/classes/LongMath.src/M000128.html +4 -13
  109. data/doc/classes/LongMath.src/M000129.html +4 -82
  110. data/doc/classes/LongMath.src/M000130.html +90 -5
  111. data/doc/classes/LongMath.src/M000131.html +8 -5
  112. data/doc/classes/LongMath.src/M000132.html +5 -15
  113. data/doc/classes/LongMath.src/M000133.html +14 -10
  114. data/doc/classes/LongMath.src/M000134.html +17 -149
  115. data/doc/classes/LongMath.src/M000135.html +206 -6
  116. data/doc/classes/LongMath.src/M000136.html +41 -22
  117. data/doc/classes/LongMath.src/M000137.html +58 -0
  118. data/doc/classes/Numeric.src/M000100.html +1 -1
  119. data/doc/classes/Rational.src/M000101.html +2 -2
  120. data/doc/created.rid +1 -1
  121. data/doc/files/lib/long-decimal_rb.html +188 -0
  122. data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
  123. data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
  124. data/doc/fr_method_index.html +25 -24
  125. data/lib/long-decimal.rb +156 -40
  126. data/test/testlongdecimal.rb +297 -6
  127. data/version.rb +1 -1
  128. metadata +5 -2
@@ -10,7 +10,7 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1660</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1668</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimal</span>(<span class="ruby-identifier">a</span>, <span class="ruby-identifier">b</span> = <span class="ruby-value">0</span>)
15
15
  <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">b</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">a</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimal</span>) <span class="ruby-keyword kw">then</span>
16
16
  <span class="ruby-identifier">a</span>
@@ -10,7 +10,7 @@
10
10
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
11
11
  </head>
12
12
  <body class="standalone-code">
13
- <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1673</span>
13
+ <pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 1681</span>
14
14
  <span class="ruby-keyword kw">def</span> <span class="ruby-constant">LongDecimalQuot</span>(<span class="ruby-identifier">first</span>, <span class="ruby-identifier">second</span>)
15
15
  <span class="ruby-constant">LongDecimalQuot</span>.<span class="ruby-identifier">new!</span>(<span class="ruby-identifier">first</span>, <span class="ruby-identifier">second</span>)
16
16
  <span class="ruby-keyword kw">end</span></pre>
@@ -38,7 +38,7 @@
38
38
  <a href="classes/LongDecimal.html#M000069">/ (LongDecimal)</a><br />
39
39
  <a href="classes/LongDecimal.html#M000077"><< (LongDecimal)</a><br />
40
40
  <a href="classes/LongDecimalBase.html#M000110"><=> (LongDecimalBase)</a><br />
41
- <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000137"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
41
+ <a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000138"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
42
42
  <a href="classes/LongDecimal.html#M000094">== (LongDecimal)</a><br />
43
43
  <a href="classes/LongDecimalQuot.html#M000025">== (LongDecimalQuot)</a><br />
44
44
  <a href="classes/LongDecimal.html#M000095">=== (LongDecimal)</a><br />
@@ -47,11 +47,10 @@
47
47
  <a href="files/lib/long-decimal_rb.html#M000002">LongDecimalQuot (lib/long-decimal.rb)</a><br />
48
48
  <a href="classes/LongDecimal.html#M000079">[] (LongDecimal)</a><br />
49
49
  <a href="classes/LongDecimal.html#M000075">^ (LongDecimal)</a><br />
50
- <a href="classes/LongDecimal.html#M000088">abs (LongDecimal)</a><br />
51
50
  <a href="classes/LongDecimalQuot.html#M000022">abs (LongDecimalQuot)</a><br />
51
+ <a href="classes/LongDecimal.html#M000088">abs (LongDecimal)</a><br />
52
52
  <a href="classes/LongDecimalBase.html#M000109">abs2 (LongDecimalBase)</a><br />
53
53
  <a href="classes/LongDecimal.html#M000055">anti_equalize_scale (LongDecimal)</a><br />
54
- <a href="classes/LongMath.html#M000128">calc_iprec_for_exp (LongMath)</a><br />
55
54
  <a href="classes/LongMath.html#M000126">calc_pi (LongMath)</a><br />
56
55
  <a href="classes/LongMath.html#M000114">check_is_int (LongMath)</a><br />
57
56
  <a href="classes/LongMath.html#M000115">check_is_ld (LongMath)</a><br />
@@ -63,15 +62,17 @@
63
62
  <a href="classes/LongDecimalBase.html#M000104">dec (LongDecimalBase)</a><br />
64
63
  <a href="classes/LongDecimalQuot.html#M000013">dec! (LongDecimalQuot)</a><br />
65
64
  <a href="classes/LongDecimal.html#M000060">dec! (LongDecimal)</a><br />
66
- <a href="classes/LongDecimal.html#M000051">denominator (LongDecimal)</a><br />
67
65
  <a href="classes/LongDecimalQuot.html#M000006">denominator (LongDecimalQuot)</a><br />
66
+ <a href="classes/LongDecimal.html#M000051">denominator (LongDecimal)</a><br />
68
67
  <a href="classes/LongDecimal.html#M000066">divide (LongDecimal)</a><br />
69
68
  <a href="classes/LongDecimal.html#M000067">divide_s (LongDecimal)</a><br />
70
- <a href="classes/LongDecimal.html#M000071">divmod (LongDecimal)</a><br />
71
69
  <a href="classes/LongDecimalQuot.html#M000020">divmod (LongDecimalQuot)</a><br />
70
+ <a href="classes/LongDecimal.html#M000071">divmod (LongDecimal)</a><br />
72
71
  <a href="classes/LongDecimal.html#M000054">equalize_scale (LongDecimal)</a><br />
73
72
  <a href="classes/LongMath.html#M000127">exp (LongMath)</a><br />
74
- <a href="classes/LongMath.html#M000129">exp_internal (LongMath)</a><br />
73
+ <a href="classes/LongMath.html#M000129">exp10 (LongMath)</a><br />
74
+ <a href="classes/LongMath.html#M000128">exp2 (LongMath)</a><br />
75
+ <a href="classes/LongMath.html#M000130">exp_internal (LongMath)</a><br />
75
76
  <a href="classes/LongMath.html#M000124">gcd_with_high_power (LongMath)</a><br />
76
77
  <a href="classes/LongDecimalQuot.html#M000032">hash (LongDecimalQuot)</a><br />
77
78
  <a href="classes/LongDecimal.html#M000098">hash (LongDecimal)</a><br />
@@ -85,10 +86,10 @@
85
86
  <a href="classes/LongDecimalBase.html#M000108">inverse (LongDecimalBase)</a><br />
86
87
  <a href="classes/LongDecimalQuot.html#M000028">is_int? (LongDecimalQuot)</a><br />
87
88
  <a href="classes/LongDecimal.html#M000090">is_int? (LongDecimal)</a><br />
88
- <a href="classes/LongMath.html#M000131">log (LongMath)</a><br />
89
- <a href="classes/LongMath.html#M000132">log10 (LongMath)</a><br />
90
- <a href="classes/LongMath.html#M000133">log2 (LongMath)</a><br />
91
- <a href="classes/LongMath.html#M000134">log_internal (LongMath)</a><br />
89
+ <a href="classes/LongMath.html#M000132">log (LongMath)</a><br />
90
+ <a href="classes/LongMath.html#M000133">log10 (LongMath)</a><br />
91
+ <a href="classes/LongMath.html#M000134">log2 (LongMath)</a><br />
92
+ <a href="classes/LongMath.html#M000135">log_internal (LongMath)</a><br />
92
93
  <a href="classes/LongMath.html#M000119">merge_from_words (LongMath)</a><br />
93
94
  <a href="classes/LongDecimal.html#M000039">minus_one! (LongDecimal)</a><br />
94
95
  <a href="classes/LongDecimal.html#M000081">move_point_left (LongDecimal)</a><br />
@@ -98,34 +99,34 @@
98
99
  <a href="classes/LongMath.html#M000125">multiplicity_of_factor (LongMath)</a><br />
99
100
  <a href="classes/LongDecimal.html#M000041">new (LongDecimal)</a><br />
100
101
  <a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
101
- <a href="classes/LongDecimal.html#M000034">new! (LongDecimal)</a><br />
102
102
  <a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
103
+ <a href="classes/LongDecimal.html#M000034">new! (LongDecimal)</a><br />
103
104
  <a href="classes/LongDecimal.html#M000057">next (LongDecimal)</a><br />
104
105
  <a href="classes/LongDecimalQuot.html#M000005">numerator (LongDecimalQuot)</a><br />
105
106
  <a href="classes/LongDecimal.html#M000036">one! (LongDecimal)</a><br />
106
- <a href="classes/LongDecimalQuot.html#M000027">one? (LongDecimalQuot)</a><br />
107
107
  <a href="classes/LongDecimal.html#M000097">one? (LongDecimal)</a><br />
108
- <a href="classes/LongMath.html#M000135">power (LongMath)</a><br />
109
- <a href="classes/LongMath.html#M000136">power_internal (LongMath)</a><br />
108
+ <a href="classes/LongDecimalQuot.html#M000027">one? (LongDecimalQuot)</a><br />
109
+ <a href="classes/LongMath.html#M000136">power (LongMath)</a><br />
110
+ <a href="classes/LongMath.html#M000137">power_internal (LongMath)</a><br />
110
111
  <a href="classes/LongDecimal.html#M000040">power_of_ten! (LongDecimal)</a><br />
111
112
  <a href="classes/LongDecimal.html#M000058">pred (LongDecimal)</a><br />
112
113
  <a href="classes/LongDecimal.html#M000068">rdiv (LongDecimal)</a><br />
113
114
  <a href="classes/LongDecimalBase.html#M000107">reciprocal (LongDecimalBase)</a><br />
114
- <a href="classes/LongDecimal.html#M000043">round_to_scale (LongDecimal)</a><br />
115
115
  <a href="classes/LongDecimalQuot.html#M000023">round_to_scale (LongDecimalQuot)</a><br />
116
+ <a href="classes/LongDecimal.html#M000043">round_to_scale (LongDecimal)</a><br />
116
117
  <a href="classes/LongDecimal.html#M000042">scale= (LongDecimal)</a><br />
117
118
  <a href="classes/LongDecimalBase.html#M000112">scale_equal (LongDecimalBase)</a><br />
118
119
  <a href="classes/LongDecimalBase.html#M000111">scale_ufo (LongDecimalBase)</a><br />
119
- <a href="classes/LongDecimalQuot.html#M000029">sgn (LongDecimalQuot)</a><br />
120
120
  <a href="classes/LongDecimal.html#M000091">sgn (LongDecimal)</a><br />
121
- <a href="classes/LongDecimal.html#M000093">sign (LongDecimal)</a><br />
121
+ <a href="classes/LongDecimalQuot.html#M000029">sgn (LongDecimalQuot)</a><br />
122
122
  <a href="classes/LongDecimalQuot.html#M000031">sign (LongDecimalQuot)</a><br />
123
- <a href="classes/LongDecimalQuot.html#M000030">signum (LongDecimalQuot)</a><br />
123
+ <a href="classes/LongDecimal.html#M000093">sign (LongDecimal)</a><br />
124
124
  <a href="classes/LongDecimal.html#M000092">signum (LongDecimal)</a><br />
125
+ <a href="classes/LongDecimalQuot.html#M000030">signum (LongDecimalQuot)</a><br />
125
126
  <a href="classes/LongDecimal.html#M000080">size (LongDecimal)</a><br />
126
127
  <a href="classes/LongMath.html#M000118">split_to_words (LongMath)</a><br />
127
128
  <a href="classes/LongDecimal.html#M000086">sqrt (LongDecimal)</a><br />
128
- <a href="classes/LongMath.html#M000130">sqrt (LongMath)</a><br />
129
+ <a href="classes/LongMath.html#M000131">sqrt (LongMath)</a><br />
129
130
  <a href="classes/LongDecimal.html#M000087">sqrt_with_remainder (LongDecimal)</a><br />
130
131
  <a href="classes/LongMath.html#M000120">sqrtb (LongMath)</a><br />
131
132
  <a href="classes/LongMath.html#M000121">sqrtb_with_remainder (LongMath)</a><br />
@@ -137,13 +138,13 @@
137
138
  <a href="classes/LongDecimal.html#M000038">ten! (LongDecimal)</a><br />
138
139
  <a href="classes/LongDecimalQuot.html#M000009">to_bd (LongDecimalQuot)</a><br />
139
140
  <a href="classes/LongDecimal.html#M000050">to_bd (LongDecimal)</a><br />
140
- <a href="classes/LongDecimal.html#M000047">to_f (LongDecimal)</a><br />
141
141
  <a href="classes/LongDecimalQuot.html#M000008">to_f (LongDecimalQuot)</a><br />
142
- <a href="classes/LongDecimalQuot.html#M000010">to_i (LongDecimalQuot)</a><br />
142
+ <a href="classes/LongDecimal.html#M000047">to_f (LongDecimal)</a><br />
143
143
  <a href="classes/LongDecimal.html#M000048">to_i (LongDecimal)</a><br />
144
- <a href="classes/LongDecimal.html#M000049">to_ld (LongDecimal)</a><br />
145
- <a href="classes/Numeric.html#M000100">to_ld (Numeric)</a><br />
144
+ <a href="classes/LongDecimalQuot.html#M000010">to_i (LongDecimalQuot)</a><br />
146
145
  <a href="classes/LongDecimalQuot.html#M000011">to_ld (LongDecimalQuot)</a><br />
146
+ <a href="classes/Numeric.html#M000100">to_ld (Numeric)</a><br />
147
+ <a href="classes/LongDecimal.html#M000049">to_ld (LongDecimal)</a><br />
147
148
  <a href="classes/Rational.html#M000101">to_ld (Rational)</a><br />
148
149
  <a href="classes/LongDecimalBase.html#M000102">to_r (LongDecimalBase)</a><br />
149
150
  <a href="classes/LongDecimal.html#M000044">to_s (LongDecimal)</a><br />
@@ -153,8 +154,8 @@
153
154
  <a href="classes/LongDecimal.html#M000037">two! (LongDecimal)</a><br />
154
155
  <a href="classes/LongDecimal.html#M000061">unit (LongDecimal)</a><br />
155
156
  <a href="classes/LongDecimal.html#M000035">zero! (LongDecimal)</a><br />
156
- <a href="classes/LongDecimalQuot.html#M000026">zero? (LongDecimalQuot)</a><br />
157
157
  <a href="classes/LongDecimal.html#M000096">zero? (LongDecimal)</a><br />
158
+ <a href="classes/LongDecimalQuot.html#M000026">zero? (LongDecimalQuot)</a><br />
158
159
  <a href="classes/LongDecimal.html#M000074">| (LongDecimal)</a><br />
159
160
  <a href="classes/LongDecimal.html#M000076">~ (LongDecimal)</a><br />
160
161
  </div>
data/lib/long-decimal.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  #
2
2
  # long-decimal.rb -- Arbitrary precision decimals with fixed decimal point
3
3
  #
4
- # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.14 2006/03/27 22:19:18 bk1 Exp $
5
- # CVS-Label: $Name: PRE_ALPHA_0_17 $
4
+ # CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/lib/long-decimal.rb,v 1.18 2006/03/30 21:06:43 bk1 Exp $
5
+ # CVS-Label: $Name: PRE_ALPHA_0_18 $
6
6
  # Author: $Author: bk1 $ (Karl Brodowsky)
7
7
  #
8
8
  require "complex"
@@ -56,7 +56,7 @@ end # LongDecimalRoundingMode
56
56
  # common base class for LongDecimal and LongDecimalQuot
57
57
  #
58
58
  class LongDecimalBase < Numeric
59
- @RCS_ID='-$Id: long-decimal.rb,v 1.14 2006/03/27 22:19:18 bk1 Exp $-'
59
+ @RCS_ID='-$Id: long-decimal.rb,v 1.18 2006/03/30 21:06:43 bk1 Exp $-'
60
60
 
61
61
  include LongDecimalRoundingMode
62
62
 
@@ -159,7 +159,7 @@ end # class LongDecimalBase
159
159
  # digits and the other one the position of the decimal point.
160
160
  #
161
161
  class LongDecimal < LongDecimalBase
162
- @RCS_ID='-$Id: long-decimal.rb,v 1.14 2006/03/27 22:19:18 bk1 Exp $-'
162
+ @RCS_ID='-$Id: long-decimal.rb,v 1.18 2006/03/30 21:06:43 bk1 Exp $-'
163
163
 
164
164
  # MINUS_ONE = LongDecimal(-1)
165
165
  # ZERO = LongDecimal(0)
@@ -328,6 +328,10 @@ class LongDecimal < LongDecimalBase
328
328
  num_exp = num_exp.to_i
329
329
  iscale = num_frac.length - num_exp
330
330
  scale += iscale
331
+ if (scale < 0)
332
+ num_frac += "0" * (-scale)
333
+ scale = 0
334
+ end
331
335
  int_val = (num_int + num_frac).to_i
332
336
  if negative then
333
337
  int_val = -int_val
@@ -465,7 +469,7 @@ class LongDecimal < LongDecimalBase
465
469
 
466
470
  #
467
471
  # convert self into Float
468
- # this works straitforward by dividing int_val by power of 10 in
472
+ # this works straitforward by dividing numerator by power of 10 in
469
473
  # float-arithmetic, in all cases where numerator and denominator are
470
474
  # within the ranges expressable as Floats. Goes via string
471
475
  # representation otherwise.
@@ -474,23 +478,27 @@ class LongDecimal < LongDecimalBase
474
478
  divisor = denominator
475
479
  if (divisor == 1) then
476
480
  return numerator.to_f
477
- elsif int_val.abs <= LongMath::MAX_FLOATABLE then
481
+ elsif numerator.abs <= LongMath::MAX_FLOATABLE then
478
482
  if (divisor.abs > LongMath::MAX_FLOATABLE) then
479
483
  return 0.0
480
484
  else
481
- f = int_val.to_f
485
+ f = numerator.to_f
482
486
  return f / divisor
483
487
  end
484
488
  elsif numerator.abs < divisor
485
489
  # self is between -1 and 1
490
+
486
491
  # factor = numerator.abs.div(LongMath::MAX_FLOATABLE)
487
492
  # digits = factor.to_ld.int_digits10
488
493
  # return LongDecimal(numerator.div(10**digits), scale -digits).to_f
489
494
  return self.to_s.to_f
490
495
  else
491
- # s2 = [scale.div(2), 1].max
492
- # return LongDecimal(numerator.div(10**s2), scale - s2).to_f
493
- return self.to_s.to_f
496
+ q = numerator.abs / divisor
497
+ if (q.abs > 1000000000000000000000)
498
+ return q.to_f
499
+ else
500
+ return self.to_s.to_f
501
+ end
494
502
  end
495
503
  end
496
504
 
@@ -1195,7 +1203,7 @@ end # LongDecimal
1195
1203
  #
1196
1204
  class LongDecimalQuot < LongDecimalBase
1197
1205
 
1198
- @RCS_ID='-$Id: long-decimal.rb,v 1.14 2006/03/27 22:19:18 bk1 Exp $-'
1206
+ @RCS_ID='-$Id: long-decimal.rb,v 1.18 2006/03/30 21:06:43 bk1 Exp $-'
1199
1207
 
1200
1208
  #
1201
1209
  # constructor
@@ -1703,7 +1711,7 @@ class Rational
1703
1711
  # optional second argument gives the rouding mode
1704
1712
  #
1705
1713
  def to_ld(prec = nil, mode = LongDecimal::ROUND_HALF_UP)
1706
- if (prec.nil?)
1714
+ if (prec.nil?)
1707
1715
  return LongDecimal(self)
1708
1716
  else
1709
1717
  l = LongDecimalQuot(self, prec)
@@ -2060,13 +2068,39 @@ module LongMath
2060
2068
  # removed in future versions.
2061
2069
  #
2062
2070
  def LongMath.exp(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2063
- check_is_ld(x, "x")
2071
+ # check_is_ld(x, "x")
2064
2072
  raise TypeError, "x=#{x.inspect} must not be greater #{MAX_EXP_ABLE}" unless x <= MAX_EXP_ABLE
2065
2073
  check_is_prec(prec, "prec")
2066
2074
  check_is_mode(mode, "mode")
2067
2075
  exp_internal(x, prec, mode)
2068
2076
  end
2069
2077
 
2078
+ #
2079
+ # calc the base-2-exponential function of x to the given precision as
2080
+ # LongDecimal. Only supports values of x such that the result still
2081
+ # fits into a float (x <= 709). This limitation is somewhat
2082
+ # arbitrary, but it is enforced in order to avoid producing numbers
2083
+ # with the exponential function that exceed the memory. It may be
2084
+ # removed in future versions.
2085
+ #
2086
+ def LongMath.exp2(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2087
+ LongMath.power(2, x, prec, mode)
2088
+ end
2089
+
2090
+ #
2091
+ # calc the base-10-exponential function of x to the given precision as
2092
+ # LongDecimal. Only supports values of x such that the result still
2093
+ # fits into a float (x <= 709). This limitation is somewhat
2094
+ # arbitrary, but it is enforced in order to avoid producing numbers
2095
+ # with the exponential function that exceed the memory. It may be
2096
+ # removed in future versions.
2097
+ #
2098
+ def LongMath.exp10(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2099
+ LongMath.power(10, x, prec, mode)
2100
+ end
2101
+
2102
+ private
2103
+
2070
2104
  #
2071
2105
  # private helper method for exponentiation
2072
2106
  # calculate internal precision
@@ -2077,14 +2111,17 @@ module LongMath
2077
2111
  xf = x.to_f
2078
2112
  iprec_extra = (xf / LOG10).abs
2079
2113
  end
2080
- iprec = ((prec+10)*1.20 + iprec_extra).round
2114
+ iprec = ((prec+10) * 1.20 + iprec_extra * 1.10).round
2115
+ # iprec = ((prec+10)*1.20 + iprec_extra).round
2116
+ # iprec = ((prec+10)*1.20 + iprec_extra*1.20).round
2117
+ # puts("calc_iprec_for_exp: iprec=#{iprec} iprec_extra=#{iprec_extra}\n")
2081
2118
  if (iprec < prec) then
2082
2119
  iprec = prec
2083
2120
  end
2084
2121
  iprec
2085
2122
  end
2086
2123
 
2087
- # private :calc_iprec_for_exp
2124
+ public
2088
2125
 
2089
2126
  #
2090
2127
  # internal functionality of exp. exposes some more parameters, that
@@ -2094,9 +2131,13 @@ module LongMath
2094
2131
  # not work correctly
2095
2132
  #
2096
2133
  def LongMath.exp_internal(x, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, j = nil, k = nil, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN)
2097
- check_is_ld(x, "x")
2134
+ # check_is_ld(x, "x")
2098
2135
  if (prec == nil) then
2099
- prec = x.scale
2136
+ if (x.kind_of? LongDecimalBase)
2137
+ prec = x.scale
2138
+ else
2139
+ raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
2140
+ end
2100
2141
  end
2101
2142
  check_is_prec(prec, "prec")
2102
2143
 
@@ -2138,7 +2179,12 @@ module LongMath
2138
2179
  end
2139
2180
  check_is_prec(iprec, "iprec")
2140
2181
 
2141
- dprec = [ iprec, (prec + 1) << 1 ].min
2182
+ # dprec = [ (iprec*0.9).round , (prec + 1) << 1 ].min
2183
+ dprec = [ (iprec*0.9).round, prec ].max
2184
+
2185
+ unless (x.kind_of? LongDecimal)
2186
+ x = x.to_ld(iprec, mode)
2187
+ end
2142
2188
 
2143
2189
  x_k = (x / (1 << k)).round_to_scale(iprec, mode)
2144
2190
  x_j = (x_k ** j).round_to_scale(iprec, mode)
@@ -2173,15 +2219,19 @@ module LongMath
2173
2219
  end
2174
2220
  y = y_k.round_to_scale(prec, final_mode)
2175
2221
  y
2176
- end
2222
+
2223
+ end # exp_internal
2177
2224
 
2178
2225
  #
2179
2226
  # calculate approximation of sqrt of a LongDecimal.
2180
2227
  #
2181
- def LongMath.sqrt(x, prec, rounding_mode)
2182
- check_is_ld(x, "x")
2228
+ def LongMath.sqrt(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2229
+ # check_is_ld(x, "x")
2183
2230
  check_is_prec(prec, "prec")
2184
2231
  check_is_mode(mode, "mode")
2232
+ unless (x.kind_of? LongDecimal)
2233
+ x = x.to_ld(2*(prec+1), mode)
2234
+ end
2185
2235
  x.sqrt(prec, mode)
2186
2236
  end
2187
2237
 
@@ -2190,7 +2240,7 @@ module LongMath
2190
2240
  # LongDecimal.
2191
2241
  #
2192
2242
  def LongMath.log(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2193
- check_is_ld(x, "x")
2243
+ # check_is_ld(x, "x")
2194
2244
  check_is_prec(prec, "prec")
2195
2245
  check_is_mode(mode, "mode")
2196
2246
  log_internal(x, prec, mode)
@@ -2201,13 +2251,17 @@ module LongMath
2201
2251
  # LongDecimal.
2202
2252
  #
2203
2253
  def LongMath.log10(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2204
- check_is_ld(x, "x")
2254
+ # check_is_ld(x, "x")
2205
2255
  check_is_prec(prec, "prec")
2256
+ check_is_mode(mode, "mode")
2257
+ iprec = prec + 2
2258
+ unless (x.kind_of? LongDecimal)
2259
+ x = x.to_ld(iprec, mode)
2260
+ end
2206
2261
  if (x.one?) then
2207
2262
  return LongDecimal.zero!(prec)
2208
2263
  end
2209
- check_is_mode(mode, "mode")
2210
- iprec = prec + 2
2264
+
2211
2265
  id = x.int_digits10
2212
2266
  xx = x.move_point_left(id)
2213
2267
  # puts("x=#{x} xx=#{xx} id=#{id} iprec=#{iprec}\n")
@@ -2222,13 +2276,16 @@ module LongMath
2222
2276
  # LongDecimal.
2223
2277
  #
2224
2278
  def LongMath.log2(x, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2225
- check_is_ld(x, "x")
2279
+ # check_is_ld(x, "x")
2226
2280
  check_is_prec(prec, "prec")
2281
+ check_is_mode(mode, "mode")
2282
+ iprec = prec + 2
2283
+ unless (x.kind_of? LongDecimal)
2284
+ x = x.to_ld(iprec, mode)
2285
+ end
2227
2286
  if (x.one?) then
2228
2287
  return LongDecimal.zero!(prec)
2229
2288
  end
2230
- check_is_mode(mode, "mode")
2231
- iprec = prec + 2
2232
2289
  id = x.int_digits2
2233
2290
  xx = (x / (1 << id)).round_to_scale(x.scale+id)
2234
2291
  # puts("x=#{x} xx=#{xx} id=#{id} iprec=#{iprec}\n")
@@ -2246,15 +2303,16 @@ module LongMath
2246
2303
  # not work correctly
2247
2304
  #
2248
2305
  def LongMath.log_internal(x, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN)
2249
- check_is_ld(x)
2306
+ # check_is_ld(x)
2250
2307
  raise TypeError, "x=#{x.inspect} must not be positive" unless x > 0
2251
2308
  if (prec == nil) then
2252
- prec = x.scale
2309
+ if (x.kind_of? LongDecimalBase)
2310
+ prec = x.scale
2311
+ else
2312
+ raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
2313
+ end
2253
2314
  end
2254
2315
  check_is_prec(prec, "prec")
2255
- if (x.one?) then
2256
- return LongDecimal.zero!(prec)
2257
- end
2258
2316
 
2259
2317
  if (final_mode == nil)
2260
2318
  final_mode = LongDecimal::ROUND_HALF_DOWN
@@ -2269,6 +2327,12 @@ module LongMath
2269
2327
  iprec = prec
2270
2328
  end
2271
2329
  check_is_prec(iprec, "iprec")
2330
+ unless (x.kind_of? LongDecimal)
2331
+ x = x.to_ld(iprec, mode)
2332
+ end
2333
+ if (x.one?) then
2334
+ return LongDecimal.zero!(prec)
2335
+ end
2272
2336
 
2273
2337
  # dprec = [ iprec - 1, (prec + 1) << 1 ].min
2274
2338
  dprec = iprec - 1
@@ -2303,7 +2367,7 @@ module LongMath
2303
2367
  # puts("xf=#{xf}\n")
2304
2368
  mlx = Math.log(xf)
2305
2369
  # puts("log(xf)=#{mlx}\n")
2306
- estimate = mlx.to_ld.round_to_scale(20, mode)
2370
+ estimate = mlx.to_ld(20, mode)
2307
2371
  exp_part = exp(estimate, iprec << 1)
2308
2372
  # puts("y=#{y} s=#{s} est=#{estimate} part=#{exp_part} x=#{x}\n")
2309
2373
  x = (x / exp_part).round_to_scale(iprec, mode)
@@ -2350,14 +2414,50 @@ module LongMath
2350
2414
  # fits into a float (y <= 709)
2351
2415
  #
2352
2416
  def LongMath.power(x, y, prec, mode = LongDecimal::ROUND_HALF_DOWN)
2353
- check_is_ld(x, "x")
2354
- check_is_ld(y, "y")
2417
+ # check_is_ld(x, "x")
2418
+ # check_is_ld(y, "y")
2355
2419
  raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
2356
2420
  raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x <= MAX_FLOATABLE
2357
2421
  raise TypeError, "x=#{x.inspect} must not positive" unless x > 0
2358
2422
  check_is_prec(prec, "prec")
2359
2423
  check_is_mode(mode, "mode")
2360
- LongMath.power_internal(x, y, prec, mode)
2424
+
2425
+ # try shortcut if exponent is an integer
2426
+ if (y.kind_of? LongDecimalBase) && y.is_int?
2427
+ y = y.to_i
2428
+ end
2429
+ if (y.kind_of? Integer)
2430
+ unless x.kind_of? LongDecimal
2431
+ x = x.to_ld(prec)
2432
+ end
2433
+ z = x**y
2434
+ return z.to_ld(prec, mode)
2435
+ end
2436
+
2437
+ # it can be assumed that the exponent is not an integer, so it should
2438
+ # be converted into LongDecimal
2439
+ unless (y.kind_of? LongDecimal)
2440
+ y = y.to_ld(prec, mode)
2441
+ end
2442
+
2443
+ # try shortcut if base is an integer
2444
+ if (x.kind_of? LongDecimalBase) && x.is_int?
2445
+ x = x.to_i
2446
+ end
2447
+ if (x.kind_of? Integer)
2448
+ y0 = y.round_to_scale(0, LongDecimal::ROUND_HALF_UP).to_i
2449
+ z0 = x**y0
2450
+ y1 = y - y0
2451
+ prec_extra = 0
2452
+ if (y0 > 0)
2453
+ prec_extra = (y0*Math.log10(x.to_f)).ceil
2454
+ end
2455
+ z1 = LongMath.power_internal(x, y1, prec+prec_extra, mode)
2456
+ # puts("prec=#{prec} prec_extra=#{prec_extra} x=#{x} y0=#{y0} z0=#{z0} y1=#{y1} z1=#{z1}\n")
2457
+ z = z0 * z1
2458
+ return z.to_ld(prec, mode)
2459
+ end
2460
+ return LongMath.power_internal(x, y, prec, mode)
2361
2461
  end
2362
2462
 
2363
2463
  #
@@ -2368,9 +2468,17 @@ module LongMath
2368
2468
  # not work correctly
2369
2469
  #
2370
2470
  def LongMath.power_internal(x, y, prec = nil, final_mode = LongDecimal::ROUND_HALF_DOWN, iprec = nil, mode = LongDecimal::ROUND_HALF_DOWN)
2371
- check_is_ld(x, "x")
2471
+ # check_is_ld(x, "x")
2372
2472
  if (prec == nil) then
2373
- prec = x.scale
2473
+ if (x.kind_of? LongDecimalBase) && (y.kind_of? LongDecimalBase)
2474
+ prec = [x.scale, y.scale].max
2475
+ elsif (x.kind_of? LongDecimalBase)
2476
+ prec = x.scale
2477
+ elsif (y.kind_of? LongDecimalBase)
2478
+ prec = y.scale
2479
+ else
2480
+ raise ArgumentError, "precision must be supplied either as precision of x=#{x} or explicitely"
2481
+ end
2374
2482
  end
2375
2483
  check_is_prec(prec, "prec")
2376
2484
 
@@ -2385,8 +2493,16 @@ module LongMath
2385
2493
  # iprec = (prec * 1.2 + 20 + (y.abs.to_f) * 1.5 * x.int_digits2).round
2386
2494
  if (iprec == nil) then
2387
2495
  iprec = calc_iprec_for_exp(logx_y_f, prec) + 2
2496
+ # puts("power_internal: prec=#{prec} iprec=#{iprec} logx_y_f=#{logx_y_f}\n")
2497
+ end
2498
+ unless (x.kind_of? LongDecimal)
2499
+ x = x.to_ld(iprec, mode)
2388
2500
  end
2389
- # puts("power_internal: x=#{x} y=#{y} logx_y=#{logx_y_f} iprec=#{iprec} prec=#{prec}\n")
2501
+ unless (y.kind_of? LongDecimal)
2502
+ y = y.to_ld(iprec, mode)
2503
+ end
2504
+
2505
+ # puts("power_internal: (got iprec, x & y) x=#{x} y=#{y} logx_y=#{logx_y_f} iprec=#{iprec} prec=#{prec}\n")
2390
2506
  logx = log(x, iprec, mode)
2391
2507
  logx_y = logx*y
2392
2508
  xy = exp_internal(logx_y, prec + 1, mode)