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.
- data/README +10 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.html +1 -1
- data/doc/classes/LongDecimal.src/M000041.html +4 -0
- data/doc/classes/LongDecimal.src/M000042.html +1 -1
- data/doc/classes/LongDecimal.src/M000043.html +1 -1
- data/doc/classes/LongDecimal.src/M000044.html +1 -1
- data/doc/classes/LongDecimal.src/M000045.html +1 -1
- data/doc/classes/LongDecimal.src/M000046.html +1 -1
- data/doc/classes/LongDecimal.src/M000047.html +10 -6
- data/doc/classes/LongDecimal.src/M000048.html +1 -1
- data/doc/classes/LongDecimal.src/M000049.html +1 -1
- data/doc/classes/LongDecimal.src/M000050.html +1 -1
- data/doc/classes/LongDecimal.src/M000051.html +1 -1
- data/doc/classes/LongDecimal.src/M000052.html +1 -1
- data/doc/classes/LongDecimal.src/M000053.html +1 -1
- data/doc/classes/LongDecimal.src/M000054.html +1 -1
- data/doc/classes/LongDecimal.src/M000055.html +1 -1
- data/doc/classes/LongDecimal.src/M000056.html +1 -1
- data/doc/classes/LongDecimal.src/M000058.html +1 -1
- data/doc/classes/LongDecimal.src/M000059.html +1 -1
- data/doc/classes/LongDecimal.src/M000060.html +1 -1
- data/doc/classes/LongDecimal.src/M000061.html +1 -1
- data/doc/classes/LongDecimal.src/M000062.html +1 -1
- data/doc/classes/LongDecimal.src/M000063.html +1 -1
- data/doc/classes/LongDecimal.src/M000064.html +1 -1
- data/doc/classes/LongDecimal.src/M000065.html +1 -1
- data/doc/classes/LongDecimal.src/M000066.html +1 -1
- data/doc/classes/LongDecimal.src/M000067.html +1 -1
- data/doc/classes/LongDecimal.src/M000068.html +1 -1
- data/doc/classes/LongDecimal.src/M000069.html +1 -1
- data/doc/classes/LongDecimal.src/M000070.html +1 -1
- data/doc/classes/LongDecimal.src/M000071.html +1 -1
- data/doc/classes/LongDecimal.src/M000072.html +1 -1
- data/doc/classes/LongDecimal.src/M000073.html +1 -1
- data/doc/classes/LongDecimal.src/M000074.html +1 -1
- data/doc/classes/LongDecimal.src/M000075.html +1 -1
- data/doc/classes/LongDecimal.src/M000076.html +1 -1
- data/doc/classes/LongDecimal.src/M000077.html +1 -1
- data/doc/classes/LongDecimal.src/M000078.html +1 -1
- data/doc/classes/LongDecimal.src/M000079.html +1 -1
- data/doc/classes/LongDecimal.src/M000080.html +1 -1
- data/doc/classes/LongDecimal.src/M000081.html +1 -1
- data/doc/classes/LongDecimal.src/M000082.html +1 -1
- data/doc/classes/LongDecimal.src/M000083.html +1 -1
- data/doc/classes/LongDecimal.src/M000084.html +1 -1
- data/doc/classes/LongDecimal.src/M000085.html +1 -1
- data/doc/classes/LongDecimal.src/M000086.html +1 -1
- data/doc/classes/LongDecimal.src/M000087.html +1 -1
- data/doc/classes/LongDecimal.src/M000088.html +1 -1
- data/doc/classes/LongDecimal.src/M000089.html +1 -1
- data/doc/classes/LongDecimal.src/M000090.html +1 -1
- data/doc/classes/LongDecimal.src/M000091.html +1 -1
- data/doc/classes/LongDecimal.src/M000094.html +1 -1
- data/doc/classes/LongDecimal.src/M000095.html +1 -1
- data/doc/classes/LongDecimal.src/M000096.html +1 -1
- data/doc/classes/LongDecimal.src/M000097.html +1 -1
- data/doc/classes/LongDecimal.src/M000098.html +1 -1
- data/doc/classes/LongDecimal.src/M000099.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000003.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000004.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000005.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000006.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000007.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000008.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000009.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000010.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000011.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000012.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000013.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000014.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000015.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000016.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000017.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000018.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000019.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000020.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000021.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000022.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000023.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000024.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000025.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000026.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000027.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000028.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000029.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000032.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000033.html +1 -1
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +5 -5
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000138.html +22 -0
- data/doc/classes/LongMath.html +83 -55
- data/doc/classes/LongMath.src/M000113.html +1 -1
- data/doc/classes/LongMath.src/M000114.html +1 -1
- data/doc/classes/LongMath.src/M000115.html +1 -1
- data/doc/classes/LongMath.src/M000116.html +1 -1
- data/doc/classes/LongMath.src/M000117.html +1 -1
- data/doc/classes/LongMath.src/M000118.html +1 -1
- data/doc/classes/LongMath.src/M000119.html +1 -1
- data/doc/classes/LongMath.src/M000120.html +1 -1
- data/doc/classes/LongMath.src/M000121.html +1 -1
- data/doc/classes/LongMath.src/M000122.html +1 -1
- data/doc/classes/LongMath.src/M000123.html +1 -1
- data/doc/classes/LongMath.src/M000124.html +1 -1
- data/doc/classes/LongMath.src/M000125.html +1 -1
- data/doc/classes/LongMath.src/M000126.html +1 -1
- data/doc/classes/LongMath.src/M000127.html +2 -2
- data/doc/classes/LongMath.src/M000128.html +4 -13
- data/doc/classes/LongMath.src/M000129.html +4 -82
- data/doc/classes/LongMath.src/M000130.html +90 -5
- data/doc/classes/LongMath.src/M000131.html +8 -5
- data/doc/classes/LongMath.src/M000132.html +5 -15
- data/doc/classes/LongMath.src/M000133.html +14 -10
- data/doc/classes/LongMath.src/M000134.html +17 -149
- data/doc/classes/LongMath.src/M000135.html +206 -6
- data/doc/classes/LongMath.src/M000136.html +41 -22
- data/doc/classes/LongMath.src/M000137.html +58 -0
- data/doc/classes/Numeric.src/M000100.html +1 -1
- data/doc/classes/Rational.src/M000101.html +2 -2
- data/doc/created.rid +1 -1
- data/doc/files/lib/long-decimal_rb.html +188 -0
- data/doc/files/lib/long-decimal_rb.src/M000001.html +1 -1
- data/doc/files/lib/long-decimal_rb.src/M000002.html +1 -1
- data/doc/fr_method_index.html +25 -24
- data/lib/long-decimal.rb +156 -40
- data/test/testlongdecimal.rb +297 -6
- data/version.rb +1 -1
- 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
|
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">&&</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
|
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>
|
data/doc/fr_method_index.html
CHANGED
@@ -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#
|
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">
|
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#
|
89
|
-
<a href="classes/LongMath.html#
|
90
|
-
<a href="classes/LongMath.html#
|
91
|
-
<a href="classes/LongMath.html#
|
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/
|
109
|
-
<a href="classes/LongMath.html#M000136">
|
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/
|
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/
|
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#
|
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/
|
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/
|
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.
|
5
|
-
# CVS-Label: $Name:
|
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.
|
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.
|
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
|
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
|
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 =
|
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
|
-
|
492
|
-
|
493
|
-
|
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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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,
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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)
|