long-decimal 0.00.22 → 0.01.00
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +157 -32
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/classes/LongDecimal.src/M000036.html +1 -1
- data/doc/classes/LongDecimal.src/M000037.html +1 -1
- data/doc/classes/LongDecimal.src/M000038.html +1 -1
- data/doc/classes/LongDecimal.src/M000039.html +1 -1
- data/doc/classes/LongDecimal.src/M000040.html +1 -1
- data/doc/classes/LongDecimal.src/M000041.html +1 -1
- 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 +1 -1
- 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/M000057.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/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 +6 -2
- 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/M000092.html +1 -1
- data/doc/classes/LongDecimal.src/M000093.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/M000098.html +1 -1
- data/doc/classes/LongDecimal.src/M000099.html +1 -1
- data/doc/classes/LongDecimal.src/M000100.html +1 -1
- data/doc/classes/LongDecimal.src/M000101.html +1 -1
- data/doc/classes/LongDecimal.src/M000102.html +18 -0
- data/doc/classes/LongDecimal.src/M000103.html +18 -0
- data/doc/classes/LongDecimalBase.src/M000107.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000108.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000109.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000110.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000111.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000112.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000115.html +1 -1
- data/doc/classes/LongDecimalBase.src/M000116.html +19 -0
- data/doc/classes/LongDecimalBase.src/M000117.html +18 -0
- 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 +13 -2
- 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 +18 -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/M000030.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000031.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000034.html +18 -0
- data/doc/classes/LongDecimalQuot.src/M000035.html +18 -0
- data/doc/classes/LongDecimalRoundingMode.html +17 -2
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +17 -2
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000150.html +22 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000151.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000152.html +18 -0
- 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 +1 -1
- data/doc/classes/LongMath.src/M000128.html +1 -1
- data/doc/classes/LongMath.src/M000129.html +1 -1
- data/doc/classes/LongMath.src/M000130.html +1 -1
- data/doc/classes/LongMath.src/M000131.html +1 -1
- data/doc/classes/LongMath.src/M000132.html +1 -1
- data/doc/classes/LongMath.src/M000133.html +1 -1
- data/doc/classes/LongMath.src/M000134.html +1 -1
- data/doc/classes/LongMath.src/M000135.html +1 -1
- data/doc/classes/LongMath.src/M000136.html +1 -1
- data/doc/classes/LongMath.src/M000137.html +11 -3
- data/doc/classes/LongMath.src/M000138.html +2 -1
- data/doc/classes/LongMath.src/M000139.html +1 -1
- data/doc/classes/LongMath.src/M000140.html +1 -1
- data/doc/classes/LongMath.src/M000141.html +1 -1
- data/doc/classes/LongMath.src/M000142.html +2 -2
- data/doc/classes/LongMath.src/M000143.html +2 -2
- data/doc/classes/LongMath.src/M000144.html +3 -2
- data/doc/classes/LongMath.src/M000145.html +20 -10
- data/doc/classes/LongMath.src/M000146.html +3 -2
- data/doc/classes/LongMath.src/M000147.html +80 -0
- data/doc/classes/LongMath.src/M000148.html +63 -0
- data/doc/classes/LongMath/CacheKey.src/M000149.html +36 -0
- data/doc/classes/Numeric.src/M000104.html +23 -0
- data/doc/classes/Numeric.src/M000105.html +18 -0
- data/doc/classes/Rational.src/M000106.html +23 -0
- data/doc/created.rid +1 -1
- data/doc/files/lib/long-decimal_rb.html +189 -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 +20 -19
- data/lib/long-decimal.rb +105 -30
- data/test/testlongdecimal.rb +448 -3
- data/test/testlongdeclib.rb +127 -28
- data/test/testrandom.rb +35 -22
- data/version.rb +4 -4
- metadata +20 -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 1760</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 1773</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
@@ -23,23 +23,23 @@
|
|
23
23
|
<a href="classes/LongDecimal.html#M000076">% (LongDecimal)</a><br />
|
24
24
|
<a href="classes/LongDecimalQuot.html#M000023">% (LongDecimalQuot)</a><br />
|
25
25
|
<a href="classes/LongDecimal.html#M000077">& (LongDecimal)</a><br />
|
26
|
-
<a href="classes/LongDecimalQuot.html#M000019">* (LongDecimalQuot)</a><br />
|
27
26
|
<a href="classes/LongDecimal.html#M000069">* (LongDecimal)</a><br />
|
28
|
-
<a href="classes/
|
27
|
+
<a href="classes/LongDecimalQuot.html#M000019">* (LongDecimalQuot)</a><br />
|
29
28
|
<a href="classes/LongDecimalQuot.html#M000021">** (LongDecimalQuot)</a><br />
|
29
|
+
<a href="classes/LongDecimal.html#M000074">** (LongDecimal)</a><br />
|
30
30
|
<a href="classes/LongDecimalQuot.html#M000017">+ (LongDecimalQuot)</a><br />
|
31
31
|
<a href="classes/LongDecimal.html#M000067">+ (LongDecimal)</a><br />
|
32
32
|
<a href="classes/LongDecimalBase.html#M000110">+@ (LongDecimalBase)</a><br />
|
33
|
-
<a href="classes/LongDecimalQuot.html#M000018">- (LongDecimalQuot)</a><br />
|
34
33
|
<a href="classes/LongDecimal.html#M000068">- (LongDecimal)</a><br />
|
35
|
-
<a href="classes/LongDecimalQuot.html#
|
34
|
+
<a href="classes/LongDecimalQuot.html#M000018">- (LongDecimalQuot)</a><br />
|
36
35
|
<a href="classes/LongDecimal.html#M000066">-@ (LongDecimal)</a><br />
|
37
|
-
<a href="classes/LongDecimalQuot.html#
|
36
|
+
<a href="classes/LongDecimalQuot.html#M000016">-@ (LongDecimalQuot)</a><br />
|
38
37
|
<a href="classes/LongDecimal.html#M000073">/ (LongDecimal)</a><br />
|
38
|
+
<a href="classes/LongDecimalQuot.html#M000020">/ (LongDecimalQuot)</a><br />
|
39
39
|
<a href="classes/LongDecimal.html#M000081"><< (LongDecimal)</a><br />
|
40
|
-
<a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000150"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
|
41
40
|
<a href="classes/LongDecimalBase.html#M000115"><=> (LongDecimalBase)</a><br />
|
42
41
|
<a href="classes/LongMath/CacheKey.html#M000149"><=> (LongMath::CacheKey)</a><br />
|
42
|
+
<a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000150"><=> (LongDecimalRoundingMode::RoundingModeClass)</a><br />
|
43
43
|
<a href="classes/LongDecimal.html#M000098">== (LongDecimal)</a><br />
|
44
44
|
<a href="classes/LongDecimalQuot.html#M000027">== (LongDecimalQuot)</a><br />
|
45
45
|
<a href="classes/LongDecimal.html#M000099">=== (LongDecimal)</a><br />
|
@@ -67,8 +67,8 @@
|
|
67
67
|
<a href="classes/LongDecimal.html#M000054">denominator (LongDecimal)</a><br />
|
68
68
|
<a href="classes/LongDecimal.html#M000070">divide (LongDecimal)</a><br />
|
69
69
|
<a href="classes/LongDecimal.html#M000071">divide_s (LongDecimal)</a><br />
|
70
|
-
<a href="classes/LongDecimal.html#M000075">divmod (LongDecimal)</a><br />
|
71
70
|
<a href="classes/LongDecimalQuot.html#M000022">divmod (LongDecimalQuot)</a><br />
|
71
|
+
<a href="classes/LongDecimal.html#M000075">divmod (LongDecimal)</a><br />
|
72
72
|
<a href="classes/LongDecimal.html#M000058">equalize_scale (LongDecimal)</a><br />
|
73
73
|
<a href="classes/LongMath.html#M000134">exp (LongMath)</a><br />
|
74
74
|
<a href="classes/LongMath.html#M000136">exp10 (LongMath)</a><br />
|
@@ -76,20 +76,21 @@
|
|
76
76
|
<a href="classes/LongMath.html#M000137">exp_internal (LongMath)</a><br />
|
77
77
|
<a href="classes/LongMath.html#M000138">exp_raw (LongMath)</a><br />
|
78
78
|
<a href="classes/LongMath.html#M000129">gcd_with_high_power (LongMath)</a><br />
|
79
|
-
<a href="classes/LongDecimal.html#M000102">hash (LongDecimal)</a><br />
|
80
79
|
<a href="classes/LongDecimalQuot.html#M000034">hash (LongDecimalQuot)</a><br />
|
81
|
-
<a href="classes/
|
80
|
+
<a href="classes/LongDecimal.html#M000102">hash (LongDecimal)</a><br />
|
81
|
+
<a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000152">hash (LongDecimalRoundingMode::RoundingModeClass)</a><br />
|
82
82
|
<a href="classes/LongDecimalBase.html#M000108">inc (LongDecimalBase)</a><br />
|
83
|
-
<a href="classes/LongDecimal.html#M000063">inc! (LongDecimal)</a><br />
|
84
83
|
<a href="classes/LongDecimalQuot.html#M000014">inc! (LongDecimalQuot)</a><br />
|
84
|
+
<a href="classes/LongDecimal.html#M000063">inc! (LongDecimal)</a><br />
|
85
85
|
<a href="classes/LongDecimal.html#M000103">inspect (LongDecimal)</a><br />
|
86
86
|
<a href="classes/LongDecimalQuot.html#M000035">inspect (LongDecimalQuot)</a><br />
|
87
87
|
<a href="classes/LongMath.html#M000132">int_digits10 (LongMath)</a><br />
|
88
88
|
<a href="classes/LongDecimal.html#M000057">int_digits10 (LongDecimal)</a><br />
|
89
89
|
<a href="classes/LongDecimal.html#M000055">int_digits2 (LongDecimal)</a><br />
|
90
|
+
<a href="classes/LongDecimalRoundingMode/RoundingModeClass.html#M000151">inverse (LongDecimalRoundingMode::RoundingModeClass)</a><br />
|
90
91
|
<a href="classes/LongDecimalBase.html#M000113">inverse (LongDecimalBase)</a><br />
|
91
|
-
<a href="classes/LongDecimal.html#M000094">is_int? (LongDecimal)</a><br />
|
92
92
|
<a href="classes/LongDecimalQuot.html#M000030">is_int? (LongDecimalQuot)</a><br />
|
93
|
+
<a href="classes/LongDecimal.html#M000094">is_int? (LongDecimal)</a><br />
|
93
94
|
<a href="classes/LongMath.html#M000141">log (LongMath)</a><br />
|
94
95
|
<a href="classes/LongMath.html#M000142">log10 (LongMath)</a><br />
|
95
96
|
<a href="classes/LongMath.html#M000143">log2 (LongMath)</a><br />
|
@@ -103,16 +104,16 @@
|
|
103
104
|
<a href="classes/LongDecimal.html#M000088">move_point_right_int (LongDecimal)</a><br />
|
104
105
|
<a href="classes/LongMath.html#M000131">multiplicity_of_10 (LongMath)</a><br />
|
105
106
|
<a href="classes/LongMath.html#M000130">multiplicity_of_factor (LongMath)</a><br />
|
106
|
-
<a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
|
107
107
|
<a href="classes/LongDecimal.html#M000043">new (LongDecimal)</a><br />
|
108
|
+
<a href="classes/LongDecimalQuot.html#M000004">new (LongDecimalQuot)</a><br />
|
108
109
|
<a href="classes/LongDecimal.html#M000036">new! (LongDecimal)</a><br />
|
109
110
|
<a href="classes/LongDecimalQuot.html#M000003">new! (LongDecimalQuot)</a><br />
|
110
111
|
<a href="classes/LongDecimal.html#M000061">next (LongDecimal)</a><br />
|
111
112
|
<a href="classes/LongDecimalQuot.html#M000005">numerator (LongDecimalQuot)</a><br />
|
112
113
|
<a href="classes/LongDecimal.html#M000038">one! (LongDecimal)</a><br />
|
113
|
-
<a href="classes/LongDecimal.html#M000101">one? (LongDecimal)</a><br />
|
114
|
-
<a href="classes/LongDecimalQuot.html#M000029">one? (LongDecimalQuot)</a><br />
|
115
114
|
<a href="classes/Numeric.html#M000105">one? (Numeric)</a><br />
|
115
|
+
<a href="classes/LongDecimalQuot.html#M000029">one? (LongDecimalQuot)</a><br />
|
116
|
+
<a href="classes/LongDecimal.html#M000101">one? (LongDecimal)</a><br />
|
116
117
|
<a href="classes/LongMath.html#M000133">pi (LongMath)</a><br />
|
117
118
|
<a href="classes/LongMath.html#M000147">power (LongMath)</a><br />
|
118
119
|
<a href="classes/LongMath.html#M000148">power_internal (LongMath)</a><br />
|
@@ -123,16 +124,16 @@
|
|
123
124
|
<a href="classes/LongDecimal.html#M000046">round_to_scale (LongDecimal)</a><br />
|
124
125
|
<a href="classes/LongDecimalQuot.html#M000025">round_to_scale (LongDecimalQuot)</a><br />
|
125
126
|
<a href="classes/LongDecimal.html#M000045">round_trailing_zeros (LongDecimal)</a><br />
|
126
|
-
<a href="classes/LongDecimalQuot.html#M000007">scale= (LongDecimalQuot)</a><br />
|
127
127
|
<a href="classes/LongDecimal.html#M000044">scale= (LongDecimal)</a><br />
|
128
|
+
<a href="classes/LongDecimalQuot.html#M000007">scale= (LongDecimalQuot)</a><br />
|
128
129
|
<a href="classes/LongDecimalBase.html#M000117">scale_equal (LongDecimalBase)</a><br />
|
129
130
|
<a href="classes/LongDecimalBase.html#M000116">scale_ufo (LongDecimalBase)</a><br />
|
130
131
|
<a href="classes/LongDecimal.html#M000095">sgn (LongDecimal)</a><br />
|
131
132
|
<a href="classes/LongDecimalQuot.html#M000031">sgn (LongDecimalQuot)</a><br />
|
132
133
|
<a href="classes/LongDecimal.html#M000097">sign (LongDecimal)</a><br />
|
133
134
|
<a href="classes/LongDecimalQuot.html#M000033">sign (LongDecimalQuot)</a><br />
|
134
|
-
<a href="classes/LongDecimalQuot.html#M000032">signum (LongDecimalQuot)</a><br />
|
135
135
|
<a href="classes/LongDecimal.html#M000096">signum (LongDecimal)</a><br />
|
136
|
+
<a href="classes/LongDecimalQuot.html#M000032">signum (LongDecimalQuot)</a><br />
|
136
137
|
<a href="classes/LongDecimalQuot.html#M000013">sint_digits10 (LongDecimalQuot)</a><br />
|
137
138
|
<a href="classes/LongDecimal.html#M000056">sint_digits10 (LongDecimal)</a><br />
|
138
139
|
<a href="classes/LongDecimal.html#M000084">size (LongDecimal)</a><br />
|
@@ -149,10 +150,10 @@
|
|
149
150
|
<a href="classes/LongDecimal.html#M000089">square (LongDecimal)</a><br />
|
150
151
|
<a href="classes/LongDecimal.html#M000060">succ (LongDecimal)</a><br />
|
151
152
|
<a href="classes/LongDecimal.html#M000040">ten! (LongDecimal)</a><br />
|
152
|
-
<a href="classes/LongDecimal.html#M000053">to_bd (LongDecimal)</a><br />
|
153
153
|
<a href="classes/LongDecimalQuot.html#M000010">to_bd (LongDecimalQuot)</a><br />
|
154
|
-
<a href="classes/
|
154
|
+
<a href="classes/LongDecimal.html#M000053">to_bd (LongDecimal)</a><br />
|
155
155
|
<a href="classes/LongDecimal.html#M000050">to_f (LongDecimal)</a><br />
|
156
|
+
<a href="classes/LongDecimalQuot.html#M000009">to_f (LongDecimalQuot)</a><br />
|
156
157
|
<a href="classes/LongDecimalQuot.html#M000011">to_i (LongDecimalQuot)</a><br />
|
157
158
|
<a href="classes/LongDecimal.html#M000051">to_i (LongDecimal)</a><br />
|
158
159
|
<a href="classes/Rational.html#M000106">to_ld (Rational)</a><br />
|
@@ -160,8 +161,8 @@
|
|
160
161
|
<a href="classes/LongDecimal.html#M000052">to_ld (LongDecimal)</a><br />
|
161
162
|
<a href="classes/LongDecimalQuot.html#M000012">to_ld (LongDecimalQuot)</a><br />
|
162
163
|
<a href="classes/LongDecimalBase.html#M000107">to_r (LongDecimalBase)</a><br />
|
163
|
-
<a href="classes/LongDecimalQuot.html#M000008">to_s (LongDecimalQuot)</a><br />
|
164
164
|
<a href="classes/LongDecimal.html#M000047">to_s (LongDecimal)</a><br />
|
165
|
+
<a href="classes/LongDecimalQuot.html#M000008">to_s (LongDecimalQuot)</a><br />
|
165
166
|
<a href="classes/LongDecimal.html#M000048">to_s_10 (LongDecimal)</a><br />
|
166
167
|
<a href="classes/LongDecimal.html#M000049">to_s_internal (LongDecimal)</a><br />
|
167
168
|
<a href="classes/LongDecimal.html#M000039">two! (LongDecimal)</a><br />
|
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.33 2006/04/11 19:03:22 bk1 Exp $
|
5
|
+
# CVS-Label: $Name: ALPHA_01_00 $
|
6
6
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
7
7
|
#
|
8
8
|
require "complex"
|
@@ -37,6 +37,10 @@ module LongDecimalRoundingMode
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
+
def inverse
|
41
|
+
LongDecimalRoundingMode::INVERSE_MODE[self]
|
42
|
+
end
|
43
|
+
|
40
44
|
def hash
|
41
45
|
num
|
42
46
|
end
|
@@ -46,14 +50,29 @@ module LongDecimalRoundingMode
|
|
46
50
|
#
|
47
51
|
# rounding modes as constants
|
48
52
|
#
|
49
|
-
ROUND_UP
|
50
|
-
ROUND_DOWN
|
51
|
-
ROUND_CEILING
|
52
|
-
ROUND_FLOOR
|
53
|
-
ROUND_HALF_UP
|
54
|
-
ROUND_HALF_DOWN
|
55
|
-
|
56
|
-
|
53
|
+
ROUND_UP = RoundingModeClass.new(:ROUND_UP, 0)
|
54
|
+
ROUND_DOWN = RoundingModeClass.new(:ROUND_DOWN, 1)
|
55
|
+
ROUND_CEILING = RoundingModeClass.new(:ROUND_CEILING, 2)
|
56
|
+
ROUND_FLOOR = RoundingModeClass.new(:ROUND_FLOOR, 3)
|
57
|
+
ROUND_HALF_UP = RoundingModeClass.new(:ROUND_HALF_UP, 4)
|
58
|
+
ROUND_HALF_DOWN = RoundingModeClass.new(:ROUND_HALF_DOWN, 5)
|
59
|
+
ROUND_HALF_CEILING = RoundingModeClass.new(:ROUND_HALF_CEILING, 6)
|
60
|
+
ROUND_HALF_FLOOR = RoundingModeClass.new(:ROUND_HALF_FLOOR, 7)
|
61
|
+
ROUND_HALF_EVEN = RoundingModeClass.new(:ROUND_HALF_EVEN, 8)
|
62
|
+
ROUND_UNNECESSARY = RoundingModeClass.new(:ROUND_UNNECESSARY, 9)
|
63
|
+
|
64
|
+
INVERSE_MODE = {
|
65
|
+
ROUND_UP => ROUND_DOWN,
|
66
|
+
ROUND_DOWN => ROUND_UP,
|
67
|
+
ROUND_CEILING => ROUND_FLOOR,
|
68
|
+
ROUND_FLOOR => ROUND_CEILING,
|
69
|
+
ROUND_HALF_UP => ROUND_HALF_DOWN,
|
70
|
+
ROUND_HALF_DOWN => ROUND_HALF_UP,
|
71
|
+
ROUND_HALF_CEILING => ROUND_HALF_FLOOR,
|
72
|
+
ROUND_HALF_FLOOR => ROUND_HALF_CEILING,
|
73
|
+
ROUND_HALF_EVEN => ROUND_HALF_EVEN,
|
74
|
+
ROUND_UNNECESSARY => ROUND_UNNECESSARY
|
75
|
+
}
|
57
76
|
|
58
77
|
end # LongDecimalRoundingMode
|
59
78
|
|
@@ -61,7 +80,7 @@ end # LongDecimalRoundingMode
|
|
61
80
|
# common base class for LongDecimal and LongDecimalQuot
|
62
81
|
#
|
63
82
|
class LongDecimalBase < Numeric
|
64
|
-
@RCS_ID='-$Id: long-decimal.rb,v 1.
|
83
|
+
@RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
|
65
84
|
|
66
85
|
include LongDecimalRoundingMode
|
67
86
|
|
@@ -169,7 +188,7 @@ end # class LongDecimalBase
|
|
169
188
|
# digits and the other one the position of the decimal point.
|
170
189
|
#
|
171
190
|
class LongDecimal < LongDecimalBase
|
172
|
-
@RCS_ID='-$Id: long-decimal.rb,v 1.
|
191
|
+
@RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
|
173
192
|
|
174
193
|
# MINUS_ONE = LongDecimal(-1)
|
175
194
|
# ZERO = LongDecimal(0)
|
@@ -806,7 +825,11 @@ class LongDecimal < LongDecimalBase
|
|
806
825
|
def divide_s(other, new_scale, rounding_mode)
|
807
826
|
q = self / other
|
808
827
|
if (q.kind_of? Float) then
|
809
|
-
|
828
|
+
if (new_scale.nil?) then
|
829
|
+
q = LongDecimal(q)
|
830
|
+
else
|
831
|
+
q = q.to_ld(new_scale, rounding_mode)
|
832
|
+
end
|
810
833
|
end
|
811
834
|
if (q.kind_of? LongDecimalBase) then
|
812
835
|
if (new_scale.nil?) then
|
@@ -1202,7 +1225,7 @@ end # LongDecimal
|
|
1202
1225
|
#
|
1203
1226
|
class LongDecimalQuot < LongDecimalBase
|
1204
1227
|
|
1205
|
-
@RCS_ID='-$Id: long-decimal.rb,v 1.
|
1228
|
+
@RCS_ID='-$Id: long-decimal.rb,v 1.33 2006/04/11 19:03:22 bk1 Exp $-'
|
1206
1229
|
|
1207
1230
|
#
|
1208
1231
|
# constructor
|
@@ -1337,7 +1360,18 @@ class LongDecimalQuot < LongDecimalBase
|
|
1337
1360
|
#
|
1338
1361
|
def sint_digits10
|
1339
1362
|
if (@digits10.nil?)
|
1340
|
-
|
1363
|
+
if zero?
|
1364
|
+
@digits10 = nil
|
1365
|
+
else
|
1366
|
+
n = numerator.abs
|
1367
|
+
d = denominator
|
1368
|
+
i = 0
|
1369
|
+
while (n < d)
|
1370
|
+
i += 1
|
1371
|
+
n *= 10
|
1372
|
+
end
|
1373
|
+
@digits10 = LongMath.int_digits10(n/d) - i
|
1374
|
+
end
|
1341
1375
|
end
|
1342
1376
|
@digits10
|
1343
1377
|
end
|
@@ -1557,6 +1591,23 @@ class LongDecimalQuot < LongDecimalBase
|
|
1557
1591
|
mode = (sign_quot < 0) ? ROUND_UP : ROUND_DOWN
|
1558
1592
|
|
1559
1593
|
else
|
1594
|
+
|
1595
|
+
if (mode == ROUND_HALF_CEILING)
|
1596
|
+
# ROUND_HALF_CEILING goes to the closest allowed number >= self, even
|
1597
|
+
# for negative numbers. Since sign is handled separately, it is
|
1598
|
+
# more conveniant to use ROUND_HALF_UP or ROUND_HALF_DOWN depending on the
|
1599
|
+
# sign.
|
1600
|
+
mode = (sign_quot > 0) ? ROUND_HALF_UP : ROUND_HALF_DOWN
|
1601
|
+
|
1602
|
+
elsif (mode == ROUND_HALF_FLOOR)
|
1603
|
+
# ROUND_HALF_FLOOR goes to the closest allowed number <= self, even
|
1604
|
+
# for negative numbers. Since sign is handled separately, it is
|
1605
|
+
# more conveniant to use ROUND_HALF_UP or ROUND_HALF_DOWN depending on the
|
1606
|
+
# sign.
|
1607
|
+
mode = (sign_quot < 0) ? ROUND_HALF_UP : ROUND_HALF_DOWN
|
1608
|
+
|
1609
|
+
end
|
1610
|
+
|
1560
1611
|
# handle the ROUND_HALF_... stuff and find the adequate ROUND_UP
|
1561
1612
|
# or ROUND_DOWN to use
|
1562
1613
|
abs_rem = rem.abs
|
@@ -2324,13 +2375,14 @@ module LongMath
|
|
2324
2375
|
# private helper method for exponentiation
|
2325
2376
|
# calculate internal precision
|
2326
2377
|
#
|
2327
|
-
def LongMath.calc_iprec_for_exp(x, prec)
|
2378
|
+
def LongMath.calc_iprec_for_exp(x, prec, x_was_neg)
|
2328
2379
|
iprec_extra = 0
|
2329
2380
|
if (x > 1) then
|
2330
2381
|
xf = x.to_f
|
2331
2382
|
iprec_extra = (xf / LOG10).abs
|
2332
2383
|
end
|
2333
2384
|
iprec = ((prec+12) * 1.20 + iprec_extra * 1.10).round
|
2385
|
+
# iprec = ((prec+15) * 1.20 + iprec_extra * 1.10).round
|
2334
2386
|
# iprec = ((prec+10) * 1.20 + iprec_extra * 1.10).round
|
2335
2387
|
# iprec = ((prec+10)*1.20 + iprec_extra).round
|
2336
2388
|
# iprec = ((prec+10)*1.20 + iprec_extra*1.20).round
|
@@ -2338,6 +2390,9 @@ module LongMath
|
|
2338
2390
|
if (iprec < prec) then
|
2339
2391
|
iprec = prec
|
2340
2392
|
end
|
2393
|
+
if (x_was_neg)
|
2394
|
+
iprec += 2
|
2395
|
+
end
|
2341
2396
|
iprec
|
2342
2397
|
end
|
2343
2398
|
|
@@ -2369,9 +2424,14 @@ module LongMath
|
|
2369
2424
|
|
2370
2425
|
# if the result would come out to zero anyway, cut the work
|
2371
2426
|
xi = x.to_i
|
2372
|
-
if (xi < -LongMath::MAX_FLOATABLE) || -((xi.to_f - 1) / LOG10) > prec+
|
2427
|
+
if (xi < -LongMath::MAX_FLOATABLE) || -((xi.to_f - 1) / LOG10) > prec+10 then
|
2373
2428
|
return LongDecimal(25, prec+2).round_to_scale(prec, final_mode)
|
2374
2429
|
end
|
2430
|
+
x_was_neg = false
|
2431
|
+
if (x < 0) then
|
2432
|
+
x = -x
|
2433
|
+
x_was_neg = true
|
2434
|
+
end
|
2375
2435
|
|
2376
2436
|
if j == nil || k == nil then
|
2377
2437
|
s1 = (prec * LOG10 / LOG2) ** (1.0/3.0)
|
@@ -2395,7 +2455,7 @@ module LongMath
|
|
2395
2455
|
check_is_int(k, "k")
|
2396
2456
|
|
2397
2457
|
if (iprec == nil) then
|
2398
|
-
iprec = calc_iprec_for_exp(x, prec)
|
2458
|
+
iprec = calc_iprec_for_exp(x, prec, x_was_neg)
|
2399
2459
|
end
|
2400
2460
|
check_is_prec(iprec, "iprec")
|
2401
2461
|
|
@@ -2409,6 +2469,9 @@ module LongMath
|
|
2409
2469
|
# keep result around for exp(1)
|
2410
2470
|
set_cached(cache_key, y_k) if (cache_result)
|
2411
2471
|
end
|
2472
|
+
if (x_was_neg)
|
2473
|
+
y_k = y_k.reciprocal
|
2474
|
+
end
|
2412
2475
|
y = y_k.round_to_scale(prec, final_mode)
|
2413
2476
|
y
|
2414
2477
|
|
@@ -2421,6 +2484,7 @@ module LongMath
|
|
2421
2484
|
def LongMath.exp_raw(x, prec, j, k, iprec, mode)
|
2422
2485
|
# dprec = [ (iprec*0.9).round , (prec + 1) << 1 ].min
|
2423
2486
|
dprec = [ (iprec*0.9).round, prec ].max
|
2487
|
+
# puts("prec=#{prec} dprec=#{dprec} iprec=#{iprec}")
|
2424
2488
|
|
2425
2489
|
unless (x.kind_of? LongDecimal)
|
2426
2490
|
x = x.to_ld(iprec, mode)
|
@@ -2546,7 +2610,7 @@ module LongMath
|
|
2546
2610
|
|
2547
2611
|
check_is_prec(prec, "prec")
|
2548
2612
|
check_is_mode(mode, "mode")
|
2549
|
-
iprec = prec +
|
2613
|
+
iprec = prec + 5
|
2550
2614
|
unless (x.kind_of? LongDecimal)
|
2551
2615
|
x = x.to_ld(iprec, mode)
|
2552
2616
|
end
|
@@ -2570,7 +2634,7 @@ module LongMath
|
|
2570
2634
|
|
2571
2635
|
check_is_prec(prec, "prec")
|
2572
2636
|
check_is_mode(mode, "mode")
|
2573
|
-
iprec = prec +
|
2637
|
+
iprec = prec + 6
|
2574
2638
|
unless (x.kind_of? LongDecimal)
|
2575
2639
|
x = x.to_ld(iprec, mode)
|
2576
2640
|
end
|
@@ -2611,7 +2675,8 @@ module LongMath
|
|
2611
2675
|
check_is_mode(mode, "mode")
|
2612
2676
|
|
2613
2677
|
if (iprec == nil) then
|
2614
|
-
iprec = ((prec+10)*1.20).round
|
2678
|
+
# iprec = ((prec+10)*1.20).round
|
2679
|
+
iprec = ((prec+12)*1.20).round
|
2615
2680
|
end
|
2616
2681
|
if (iprec < prec) then
|
2617
2682
|
iprec = prec
|
@@ -2718,7 +2783,8 @@ module LongMath
|
|
2718
2783
|
logx_f = Math.log(x_f.abs)
|
2719
2784
|
logy_f = Math.log(y_f.abs)
|
2720
2785
|
logx_y_f = logx_f * y_f
|
2721
|
-
iprec_x = calc_iprec_for_exp(logx_y_f, prec)
|
2786
|
+
iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0)
|
2787
|
+
# iprec_x = calc_iprec_for_exp(logx_y_f, prec, logx_y_f < 0) + 10
|
2722
2788
|
iprec_y = iprec_x
|
2723
2789
|
iprec = iprec_x + 2
|
2724
2790
|
if (logx_f < 0)
|
@@ -2744,7 +2810,8 @@ module LongMath
|
|
2744
2810
|
raise TypeError, "y=#{y} must be numeric" unless y.kind_of? Numeric
|
2745
2811
|
# raise TypeError, "y=#{y.inspect} must not be greater #{MAX_EXP_ABLE}" unless y <= MAX_EXP_ABLE
|
2746
2812
|
# raise TypeError, "x=#{x.inspect} must not be greater #{MAX_FLOATABLE}" unless x <= MAX_FLOATABLE
|
2747
|
-
raise TypeError, "x=#{x.inspect} must not
|
2813
|
+
# raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0 || (y.kind_of? Integer) || (y.kind_of? LongDecimalBase) && y.is_int?
|
2814
|
+
raise TypeError, "x=#{x.inspect} must not negative" unless x >= 0
|
2748
2815
|
check_is_prec(prec, "prec")
|
2749
2816
|
check_is_mode(mode, "mode")
|
2750
2817
|
|
@@ -2774,7 +2841,8 @@ module LongMath
|
|
2774
2841
|
end
|
2775
2842
|
if (y.kind_of? Integer)
|
2776
2843
|
unless x.kind_of? LongDecimal
|
2777
|
-
x = x.to_ld(prec)
|
2844
|
+
# x = x.to_ld(prec)
|
2845
|
+
x = x.to_ld(iprec_x)
|
2778
2846
|
end
|
2779
2847
|
z = x**y
|
2780
2848
|
return z.to_ld(prec, mode)
|
@@ -2783,7 +2851,8 @@ module LongMath
|
|
2783
2851
|
# it can be assumed that the exponent is not an integer, so it should
|
2784
2852
|
# be converted into LongDecimal
|
2785
2853
|
unless (y.kind_of? LongDecimal)
|
2786
|
-
y = y.to_ld(prec, mode)
|
2854
|
+
# y = y.to_ld(prec, mode)
|
2855
|
+
y = y.to_ld(iprec_y, mode)
|
2787
2856
|
end
|
2788
2857
|
|
2789
2858
|
# exponent is split in two parts, an integer part and a
|
@@ -2795,7 +2864,8 @@ module LongMath
|
|
2795
2864
|
if (y0 > 0)
|
2796
2865
|
prec_extra = (y0*Math.log10(x.to_f).abs).ceil
|
2797
2866
|
end
|
2798
|
-
z1 = LongMath.power_internal(x, y1, prec+prec_extra, mode)
|
2867
|
+
# z1 = LongMath.power_internal(x, y1, prec+prec_extra , mode)
|
2868
|
+
z1 = LongMath.power_internal(x, y1, prec+prec_extra + 3, mode)
|
2799
2869
|
z = z0 * z1
|
2800
2870
|
return z.to_ld(prec, mode)
|
2801
2871
|
end
|
@@ -2838,15 +2908,20 @@ module LongMath
|
|
2838
2908
|
iprec, iprec_x, iprec_y = calc_iprec_for_power(x, y, prec)
|
2839
2909
|
end
|
2840
2910
|
unless (x.kind_of? LongDecimal)
|
2841
|
-
x = x.to_ld(iprec, mode)
|
2911
|
+
# x = x.to_ld(iprec, mode)
|
2912
|
+
x = x.to_ld(iprec_x, mode)
|
2842
2913
|
end
|
2843
2914
|
unless (y.kind_of? LongDecimal)
|
2844
|
-
y = y.to_ld(iprec, mode)
|
2915
|
+
# y = y.to_ld(iprec, mode)
|
2916
|
+
y = y.to_ld(iprec_y, mode)
|
2845
2917
|
end
|
2846
2918
|
|
2847
|
-
logx = log(x, iprec, mode)
|
2919
|
+
# logx = log(x, iprec, mode)
|
2920
|
+
logx = log(x, iprec + 20, mode)
|
2848
2921
|
logx_y = logx*y
|
2849
|
-
xy = exp_internal(logx_y, prec + 1, mode)
|
2922
|
+
# xy = exp_internal(logx_y, prec + 1, mode)
|
2923
|
+
# xy = exp_internal(logx_y, prec + 4, mode)
|
2924
|
+
xy = exp_internal(logx_y, prec + 3, mode)
|
2850
2925
|
xy.round_to_scale(prec, final_mode)
|
2851
2926
|
|
2852
2927
|
end # power_internal
|
data/test/testlongdecimal.rb
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
#
|
3
3
|
# testlongdecimal.rb -- runit test for long-decimal.rb
|
4
4
|
#
|
5
|
-
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.
|
6
|
-
# CVS-Label: $Name:
|
5
|
+
# CVS-ID: $Header: /var/cvs/long-decimal/long-decimal/test/testlongdecimal.rb,v 1.41 2006/04/11 19:39:43 bk1 Exp $
|
6
|
+
# CVS-Label: $Name: ALPHA_01_00 $
|
7
7
|
# Author: $Author: bk1 $ (Karl Brodowsky)
|
8
8
|
#
|
9
9
|
|
@@ -20,7 +20,7 @@ load "test/testlongdeclib.rb"
|
|
20
20
|
class TestLongDecimal_class < RUNIT::TestCase
|
21
21
|
include TestLongDecHelper
|
22
22
|
|
23
|
-
@RCS_ID='-$Id: testlongdecimal.rb,v 1.
|
23
|
+
@RCS_ID='-$Id: testlongdecimal.rb,v 1.41 2006/04/11 19:39:43 bk1 Exp $-'
|
24
24
|
|
25
25
|
#
|
26
26
|
# test split_to_words and merge_from_words
|
@@ -88,6 +88,11 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
88
88
|
# random tests that have failed previously
|
89
89
|
check_exp_floated(LongDecimal("0.0000000000000000000000000050000000000000000000000000000000000000000000000000000000000000017066"), 25)
|
90
90
|
check_exp_floated(LongDecimal("0.00000000000000000000000000000000000000000000000000000000000000570000000004000000000000050"), 86)
|
91
|
+
check_exp_floated(LongDecimal("-51.0000000000000000000000000000000000000000000000000000000000000000000002300000000434000994"), 22)
|
92
|
+
check_exp_floated(LongDecimal("0.0000000000000000000000816000000000000000000000000000066500000949"), 55)
|
93
|
+
check_exp_floated(LongDecimal("0.0000000000000000000000000000000000000000000012100000000000000000565000000000000000000000000593"), 94)
|
94
|
+
check_exp_floated(LongDecimal("0.49999999987500000004166666665104166667291666666406250000111607142808314732164558531736266121036184952198542695369806246270654055688438826256113701277472962860048170064139001013692959178218223"), 9)
|
95
|
+
check_exp_floated(LongDecimal("0.000000000000000000000000000000000000000000000000695000000000000000000000000000042500000000000000552"), 50)
|
91
96
|
end
|
92
97
|
|
93
98
|
#
|
@@ -129,6 +134,36 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
129
134
|
|
130
135
|
end
|
131
136
|
|
137
|
+
#
|
138
|
+
# test exp2 of LongMath
|
139
|
+
#
|
140
|
+
def test_exp2
|
141
|
+
10.times do |i|
|
142
|
+
n = (i*i+i)/2
|
143
|
+
x = LongDecimal(n, 3*i)+LongMath.pi(20)
|
144
|
+
y = LongMath.exp2(x, n)
|
145
|
+
yy = LongMath.exp2(x, n + 5)
|
146
|
+
assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
147
|
+
z = LongMath.power(2, x, n)
|
148
|
+
assert_equal(z, y, "exp2 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
#
|
153
|
+
# test exp10 of LongMath
|
154
|
+
#
|
155
|
+
def test_exp10
|
156
|
+
10.times do |i|
|
157
|
+
n = (i*i+i)/2
|
158
|
+
x = LongDecimal(n, 3*i)+LongMath.pi(20)
|
159
|
+
y = LongMath.exp10(x, n)
|
160
|
+
yy = LongMath.exp10(x, n + 5)
|
161
|
+
assert_equal(yy.round_to_scale(y.scale, LongDecimal::ROUND_HALF_DOWN), y, "x=#{x} y=#{y} yy=#{yy}")
|
162
|
+
z = LongMath.power(10, x, n)
|
163
|
+
assert_equal(z, y, "exp10 x=#{x} y=#{y} z=#{z} i=#{i} n=#{n}")
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
132
167
|
#
|
133
168
|
# test LongMath.power for bases that can be expressed as integer
|
134
169
|
#
|
@@ -420,6 +455,10 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
420
455
|
check_log_floated(LongDecimal("333.000000000000000000000000919000000000000000000000000000000000001240000000000198"), 91)
|
421
456
|
check_log_floated(LongDecimal("695.000000000000000000000000000000000000016169000000000000000572"), 10)
|
422
457
|
check_log_floated(LongDecimal("553.00000000526000000000000000000000000000000000000000000000000298000000000000000079"), 1)
|
458
|
+
check_log_floated(LongDecimal("0.999999991970000064480899482218377157786431422974955673511105941705818652715281320853860023218224705269648462237420298445354478282732556754661276455617"), 38)
|
459
|
+
check_log_floated(LongDecimal("473.00000000000000000000000000000000003200056000000000000000000000000000000000000000000664"), 1)
|
460
|
+
check_log_floated(LongDecimal("0.0000000000000000000000000000000000081600000000000000000000000000000000007510000886"), 101)
|
461
|
+
check_log_floated(LongDecimal("0.99999999999999999999999571850000000000000000001833124224999999999999992151478630572500000000033603444243589176249999856126853469423130083125615992876877728537781582"), 37)
|
423
462
|
end
|
424
463
|
|
425
464
|
#
|
@@ -471,6 +510,14 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
471
510
|
check_log10_exact(10**0, 0, 30)
|
472
511
|
check_log10_exact(10**1, 1, 30)
|
473
512
|
check_log10_exact(10**10, 10, 30)
|
513
|
+
|
514
|
+
# random tests that have failed
|
515
|
+
check_log10_floated(LongDecimal("587.00000000000000000095700000000000000000000000000000000000000000000000000000000000000000000001206"), 21)
|
516
|
+
check_log10_floated(LongDecimal("543.0000002480000900000000000000000000000000000000000000000000000000000000000000000000847"), 2)
|
517
|
+
check_log10_floated(LongDecimal("180.0000000000000000003570000000000000000000000000000000000000000000000577000000000000000000000000000637"), 2)
|
518
|
+
check_log10_floated(LongDecimal("0.0000000000000000000000000000000000000000180000000063000000000000000000000000000000000025"), 74)
|
519
|
+
check_log10_floated(LongDecimal("0.0000000000000000000000000006200000000000000000000000000000000000000000000000007940000015"), 74)
|
520
|
+
check_log10_floated(LongDecimal("0.00000000000000000000000000000000000000000032900000000000000000000233000000000000000000000000000000254"), 10)
|
474
521
|
end
|
475
522
|
|
476
523
|
#
|
@@ -491,6 +538,12 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
491
538
|
check_log2_exact(2**0, 0, 30)
|
492
539
|
check_log2_exact(2**1, 1, 30)
|
493
540
|
check_log2_exact(2**10, 10, 30)
|
541
|
+
|
542
|
+
# random tests that have failed
|
543
|
+
check_log2_floated(LongDecimal("341.00000739000000000000000000000000000000000000000000000000000000000000171"), 3)
|
544
|
+
check_log2_floated(LongDecimal("504.00000000000000000000000000000000000000000000000000000000000000000000000000000000000327400000000000828"), 1)
|
545
|
+
check_log2_floated(LongDecimal("0.0033222591362126245847176079734219269102990032888157967351353737817463383406363175903135730345286354858609181999523961456225622835123748782987926188031081"), 48)
|
546
|
+
check_log2_floated(LongDecimal("0.000802000000000000000000197000000000000000000000302"), 84)
|
494
547
|
end
|
495
548
|
|
496
549
|
|
@@ -1213,6 +1266,88 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
1213
1266
|
assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1214
1267
|
end
|
1215
1268
|
|
1269
|
+
#
|
1270
|
+
# test rounding with ROUND_HALF_CEILING
|
1271
|
+
#
|
1272
|
+
def test_round_to_scale_half_up
|
1273
|
+
l = LongDecimal("2.20")
|
1274
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1275
|
+
assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1276
|
+
assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1277
|
+
l = LongDecimal("2.21")
|
1278
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1279
|
+
assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1280
|
+
assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1281
|
+
l = LongDecimal("2.25")
|
1282
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1283
|
+
assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1284
|
+
assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1285
|
+
l = LongDecimal("2.29")
|
1286
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1287
|
+
assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1288
|
+
assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1289
|
+
l = LongDecimal("-2.20")
|
1290
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1291
|
+
assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1292
|
+
assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1293
|
+
l = LongDecimal("-2.21")
|
1294
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1295
|
+
assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1296
|
+
assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1297
|
+
l = LongDecimal("-2.25")
|
1298
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1299
|
+
assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1300
|
+
assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1301
|
+
l = LongDecimal("-2.29")
|
1302
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
1303
|
+
assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1304
|
+
assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1305
|
+
l = LongDecimal("2.24")
|
1306
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
|
1307
|
+
assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1308
|
+
end
|
1309
|
+
|
1310
|
+
#
|
1311
|
+
# test rounding with ROUND_HALF_FLOOR
|
1312
|
+
#
|
1313
|
+
def test_round_to_scale_half_down
|
1314
|
+
l = LongDecimal("2.20")
|
1315
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1316
|
+
assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1317
|
+
assert_equal("2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1318
|
+
l = LongDecimal("2.21")
|
1319
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1320
|
+
assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1321
|
+
assert_equal("2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1322
|
+
l = LongDecimal("2.25")
|
1323
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1324
|
+
assert_equal("2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1325
|
+
assert_equal("2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1326
|
+
l = LongDecimal("2.29")
|
1327
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1328
|
+
assert_equal("2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1329
|
+
assert_equal("2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1330
|
+
l = LongDecimal("-2.20")
|
1331
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1332
|
+
assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1333
|
+
assert_equal("-2.20", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1334
|
+
l = LongDecimal("-2.21")
|
1335
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1336
|
+
assert_equal("-2.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1337
|
+
assert_equal("-2.21", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1338
|
+
l = LongDecimal("-2.25")
|
1339
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1340
|
+
assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1341
|
+
assert_equal("-2.25", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1342
|
+
l = LongDecimal("-2.29")
|
1343
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
1344
|
+
assert_equal("-2.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1345
|
+
assert_equal("-2.29", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1346
|
+
l = LongDecimal("2.24")
|
1347
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
|
1348
|
+
assert_equal("2.2400", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
1349
|
+
end
|
1350
|
+
|
1216
1351
|
#
|
1217
1352
|
# test rounding with ROUND_HALF_EVEN
|
1218
1353
|
#
|
@@ -1860,6 +1995,112 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
1860
1995
|
assert((zz-z).abs < 1e-9, "z=#{z.inspect}")
|
1861
1996
|
end
|
1862
1997
|
|
1998
|
+
#
|
1999
|
+
# test division of LongDecimal with Rational as result
|
2000
|
+
#
|
2001
|
+
def test_rdiv
|
2002
|
+
x = LongDecimal(224, 2)
|
2003
|
+
|
2004
|
+
y = LongDecimal(3, 1)
|
2005
|
+
z = x.rdiv(y)
|
2006
|
+
zz = Rational(224, 30)
|
2007
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2008
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2009
|
+
z = y.rdiv(x)
|
2010
|
+
zz = Rational(30, 224)
|
2011
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2012
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2013
|
+
|
2014
|
+
y = LongDecimal(30000000, 8)
|
2015
|
+
z = x.rdiv(y)
|
2016
|
+
zz = Rational(224, 30)
|
2017
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2018
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2019
|
+
z = y.rdiv(x)
|
2020
|
+
zz = Rational(30, 224)
|
2021
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2022
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2023
|
+
|
2024
|
+
y = LongDecimal(3, 4)
|
2025
|
+
z = x.rdiv(y)
|
2026
|
+
zz = Rational(22400, 3)
|
2027
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2028
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2029
|
+
z = y.rdiv(x)
|
2030
|
+
zz = Rational(3, 22400)
|
2031
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2032
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2033
|
+
|
2034
|
+
y = LongDecimal(3333, 2)
|
2035
|
+
z = x.rdiv(y)
|
2036
|
+
zz = Rational(224, 3333)
|
2037
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2038
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2039
|
+
z = y.rdiv(x)
|
2040
|
+
zz = Rational(3333, 224)
|
2041
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2042
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2043
|
+
|
2044
|
+
y = LongDecimal(33333, 2)
|
2045
|
+
z = x.rdiv(y)
|
2046
|
+
zz = Rational(224, 33333)
|
2047
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2048
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2049
|
+
z = y.rdiv(x)
|
2050
|
+
zz = Rational(33333, 224)
|
2051
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2052
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2053
|
+
|
2054
|
+
y = LongDecimal(33333, 3)
|
2055
|
+
z = x.rdiv(y)
|
2056
|
+
zz = Rational(2240, 33333)
|
2057
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2058
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2059
|
+
z = y.rdiv(x)
|
2060
|
+
zz = Rational(33333, 2240)
|
2061
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2062
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2063
|
+
|
2064
|
+
y = LongDecimal(3333, 3)
|
2065
|
+
z = x.rdiv(y)
|
2066
|
+
zz = Rational(2240, 3333)
|
2067
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2068
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2069
|
+
z = y.rdiv(x)
|
2070
|
+
zz = Rational(3333, 2240)
|
2071
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2072
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2073
|
+
|
2074
|
+
y = LongDecimal(123456789, 3)
|
2075
|
+
z = x.rdiv(y)
|
2076
|
+
zz = Rational(2240, 123456789)
|
2077
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2078
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2079
|
+
z = y.rdiv(x)
|
2080
|
+
zz = Rational(123456789, 2240)
|
2081
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2082
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2083
|
+
|
2084
|
+
y = 5
|
2085
|
+
z = x.rdiv(y)
|
2086
|
+
zz = Rational(224, 500)
|
2087
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2088
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2089
|
+
|
2090
|
+
y = 5.001
|
2091
|
+
z = x.rdiv(y)
|
2092
|
+
zz = Rational(224, 500)
|
2093
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2094
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2095
|
+
|
2096
|
+
y = Rational(5, 3)
|
2097
|
+
z = x.rdiv(y)
|
2098
|
+
zz = Rational(224*3, 500)
|
2099
|
+
assert_kind_of(Rational, z, "z=#{z.inspect}")
|
2100
|
+
assert_equal(zz, z, "z=#{z.inspect}")
|
2101
|
+
|
2102
|
+
end
|
2103
|
+
|
1863
2104
|
#
|
1864
2105
|
# test square of LongDecimal
|
1865
2106
|
#
|
@@ -2769,6 +3010,49 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
2769
3010
|
assert_equal(zz, z, "225/2240")
|
2770
3011
|
end
|
2771
3012
|
|
3013
|
+
#
|
3014
|
+
# test sint_digits10 of LongDecimalQuot
|
3015
|
+
#
|
3016
|
+
def test_ldq_sint_digits10
|
3017
|
+
assert_equal(nil, LongDecimalQuot(LongDecimal("0.0000"), 1.to_ld).sint_digits10, "0.0000")
|
3018
|
+
assert_equal(-3, LongDecimalQuot(LongDecimal("0.0009"), 1.to_ld).sint_digits10, "0.0009")
|
3019
|
+
assert_equal(-2, LongDecimalQuot(LongDecimal("0.0099"), 1.to_ld).sint_digits10, "0.0099")
|
3020
|
+
assert_equal(-1, LongDecimalQuot(LongDecimal("0.0999"), 1.to_ld).sint_digits10, "0.0999")
|
3021
|
+
assert_equal(0, LongDecimalQuot(LongDecimal("0.9999"), 1.to_ld).sint_digits10, "0.9999")
|
3022
|
+
assert_equal(1, LongDecimalQuot(LongDecimal("1.0000"), 1.to_ld).sint_digits10, "1.0000")
|
3023
|
+
assert_equal(1, LongDecimalQuot(LongDecimal("9.9999"), 1.to_ld).sint_digits10, "9.9999")
|
3024
|
+
assert_equal(2, LongDecimalQuot(LongDecimal("10.0000"), 1.to_ld).sint_digits10, "10.0000")
|
3025
|
+
assert_equal(2, LongDecimalQuot(LongDecimal("99.9999"), 1.to_ld).sint_digits10, "99.9999")
|
3026
|
+
assert_equal(3, LongDecimalQuot(LongDecimal("100.0000"), 1.to_ld).sint_digits10, "100.0000")
|
3027
|
+
assert_equal(3, LongDecimalQuot(LongDecimal("999.9999"), 1.to_ld).sint_digits10, "999.9999")
|
3028
|
+
|
3029
|
+
assert_equal(nil, LongDecimalQuot(LongDecimal("-0.0000"), 1.to_ld).sint_digits10, "-0.0000")
|
3030
|
+
assert_equal(0, LongDecimalQuot(LongDecimal("-0.9999"), 1.to_ld).sint_digits10, "-0.9999")
|
3031
|
+
assert_equal(1, LongDecimalQuot(LongDecimal("-1.0000"), 1.to_ld).sint_digits10, "-1.0000")
|
3032
|
+
assert_equal(1, LongDecimalQuot(LongDecimal("-9.9999"), 1.to_ld).sint_digits10, "-9.9999")
|
3033
|
+
assert_equal(2, LongDecimalQuot(LongDecimal("-10.0000"), 1.to_ld).sint_digits10, "-10.0000")
|
3034
|
+
assert_equal(2, LongDecimalQuot(LongDecimal("-99.9999"), 1.to_ld).sint_digits10, "-99.9999")
|
3035
|
+
assert_equal(3, LongDecimalQuot(LongDecimal("-100.0000"), 1.to_ld).sint_digits10, "-100.0000")
|
3036
|
+
assert_equal(3, LongDecimalQuot(LongDecimal("-999.9999"), 1.to_ld).sint_digits10, "-999.9999")
|
3037
|
+
x = LongDecimalQuot(1234.to_ld, 1.to_ld)
|
3038
|
+
assert_equal(4, x.sint_digits10, "1234")
|
3039
|
+
assert_equal(4, x.sint_digits10, "1234")
|
3040
|
+
x = LongDecimalQuot(1234.to_ld(10), 1.to_ld)
|
3041
|
+
assert_equal(4, x.sint_digits10, "1234")
|
3042
|
+
assert_equal(4, x.sint_digits10, "1234")
|
3043
|
+
|
3044
|
+
10.times do |i|
|
3045
|
+
f = 1
|
3046
|
+
g = 1
|
3047
|
+
n = (i*i+i)/2
|
3048
|
+
f, g = g, f+g
|
3049
|
+
x = LongDecimal(Rational((n+1)*f, (n+2)*g), 3*i)
|
3050
|
+
y = 1/x
|
3051
|
+
assert_equal(x.to_r.to_ld.sint_digits10(), x.sint_digits10(), "x=#{x} f=#{f} g=#{g} i=#{i} n=#{n}")
|
3052
|
+
assert_equal(y.to_r.to_ld.sint_digits10(), y.sint_digits10(), "y=#{y} f=#{f} g=#{g} i=#{i} n=#{n}")
|
3053
|
+
end
|
3054
|
+
end
|
3055
|
+
|
2772
3056
|
#
|
2773
3057
|
# test rounding of LongDecimalQuot with ROUND_UP
|
2774
3058
|
#
|
@@ -2950,6 +3234,11 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
2950
3234
|
assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
2951
3235
|
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
2952
3236
|
assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3237
|
+
l = LongDecimalQuot(Rational(-225, 4), 0)
|
3238
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_UP)
|
3239
|
+
assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3240
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3241
|
+
assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
2953
3242
|
end
|
2954
3243
|
|
2955
3244
|
#
|
@@ -2991,6 +3280,103 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
2991
3280
|
assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
2992
3281
|
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
2993
3282
|
assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3283
|
+
l = LongDecimalQuot(Rational(-225, 4), 0)
|
3284
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_DOWN)
|
3285
|
+
assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3286
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3287
|
+
assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3288
|
+
end
|
3289
|
+
|
3290
|
+
#
|
3291
|
+
# test rounding of LongDecimalQuot with ROUND_HALF_CEILING
|
3292
|
+
#
|
3293
|
+
def test_ldq_round_to_scale_half_ceiling
|
3294
|
+
|
3295
|
+
# 0.99555555555555...
|
3296
|
+
l = LongDecimalQuot(Rational(224, 225), 0)
|
3297
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3298
|
+
assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3299
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3300
|
+
assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3301
|
+
l = LongDecimalQuot(-Rational(224, 225), 0)
|
3302
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3303
|
+
assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3304
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3305
|
+
assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3306
|
+
# 0.00444444444444444
|
3307
|
+
l = LongDecimalQuot(Rational(1, 225), 0)
|
3308
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3309
|
+
assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3310
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3311
|
+
assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3312
|
+
l = LongDecimalQuot(Rational(-1, 225), 0)
|
3313
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3314
|
+
assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3315
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3316
|
+
assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3317
|
+
l = LongDecimalQuot(Rational(1, 1), 1000)
|
3318
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
|
3319
|
+
assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3320
|
+
l = LongDecimalQuot(Rational(1, 1), 1)
|
3321
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_CEILING)
|
3322
|
+
assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3323
|
+
# 56.25
|
3324
|
+
l = LongDecimalQuot(Rational(225, 4), 0)
|
3325
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3326
|
+
assert_equal("56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3327
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3328
|
+
assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3329
|
+
l = LongDecimalQuot(Rational(-225, 4), 0)
|
3330
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_CEILING)
|
3331
|
+
assert_equal("-56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3332
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3333
|
+
assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3334
|
+
end
|
3335
|
+
|
3336
|
+
#
|
3337
|
+
# test rounding of LongDecimalQuot with ROUND_HALF_FLOOR
|
3338
|
+
#
|
3339
|
+
def test_ldq_round_to_scale_half_floor
|
3340
|
+
|
3341
|
+
# 0.99555555555555...
|
3342
|
+
l = LongDecimalQuot(Rational(224, 225), 0)
|
3343
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3344
|
+
assert_equal("1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3345
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3346
|
+
assert_equal("224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3347
|
+
l = LongDecimalQuot(-Rational(224, 225), 0)
|
3348
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3349
|
+
assert_equal("-1.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3350
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3351
|
+
assert_equal("-224/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3352
|
+
# 0.00444444444444444
|
3353
|
+
l = LongDecimalQuot(Rational(1, 225), 0)
|
3354
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3355
|
+
assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3356
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3357
|
+
assert_equal("1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3358
|
+
l = LongDecimalQuot(Rational(-1, 225), 0)
|
3359
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3360
|
+
assert_equal("0.0", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3361
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3362
|
+
assert_equal("-1/225[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3363
|
+
l = LongDecimalQuot(Rational(1, 1), 1000)
|
3364
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
|
3365
|
+
assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3366
|
+
l = LongDecimalQuot(Rational(1, 1), 1)
|
3367
|
+
r = l.round_to_scale(4, LongDecimal::ROUND_HALF_FLOOR)
|
3368
|
+
assert_equal("1.0000", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3369
|
+
# 56.25
|
3370
|
+
l = LongDecimalQuot(Rational(225, 4), 0)
|
3371
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3372
|
+
assert_equal("56.2", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3373
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3374
|
+
assert_equal("225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3375
|
+
l = LongDecimalQuot(Rational(-225, 4), 0)
|
3376
|
+
r = l.round_to_scale(1, LongDecimal::ROUND_HALF_FLOOR)
|
3377
|
+
assert_equal("-56.3", r.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
3378
|
+
assert_kind_of(LongDecimal, r, "must be LongDecimal")
|
3379
|
+
assert_equal("-225/4[0]", l.to_s, "l=#{l.inspect} r=#{r.inspect}")
|
2994
3380
|
end
|
2995
3381
|
|
2996
3382
|
#
|
@@ -3769,6 +4155,65 @@ class TestLongDecimal_class < RUNIT::TestCase
|
|
3769
4155
|
assert_equal(x, x, "x equals x")
|
3770
4156
|
assert_equal(y, y, "y equals y")
|
3771
4157
|
end
|
4158
|
+
|
4159
|
+
#
|
4160
|
+
# test inverse of RoundingMode
|
4161
|
+
#
|
4162
|
+
def test_rm_inverse
|
4163
|
+
assert_equal(LongMath::ROUND_UP, LongMath::ROUND_DOWN.inverse)
|
4164
|
+
assert_equal(LongMath::ROUND_DOWN, LongMath::ROUND_UP.inverse)
|
4165
|
+
assert_equal(LongMath::ROUND_CEILING, LongMath::ROUND_FLOOR.inverse)
|
4166
|
+
assert_equal(LongMath::ROUND_FLOOR, LongMath::ROUND_CEILING.inverse)
|
4167
|
+
assert_equal(LongMath::ROUND_HALF_UP, LongMath::ROUND_HALF_DOWN.inverse)
|
4168
|
+
assert_equal(LongMath::ROUND_HALF_DOWN, LongMath::ROUND_HALF_UP.inverse)
|
4169
|
+
assert_equal(LongMath::ROUND_HALF_CEILING, LongMath::ROUND_HALF_FLOOR.inverse)
|
4170
|
+
assert_equal(LongMath::ROUND_HALF_FLOOR, LongMath::ROUND_HALF_CEILING.inverse)
|
4171
|
+
assert_equal(LongMath::ROUND_HALF_EVEN, LongMath::ROUND_HALF_EVEN.inverse)
|
4172
|
+
assert_equal(LongMath::ROUND_UNNECESSARY, LongMath::ROUND_UNNECESSARY.inverse)
|
4173
|
+
end
|
4174
|
+
|
4175
|
+
|
4176
|
+
def test_scale_equal
|
4177
|
+
x = LongDecimal(3, 9)
|
4178
|
+
y = LongDecimal(4, 9)
|
4179
|
+
z = LongDecimal(4, 8)
|
4180
|
+
assert(x.scale_equal(y), "xy")
|
4181
|
+
assert(y.scale_equal(x), "yx")
|
4182
|
+
assert(! x.scale_equal(z), "xz")
|
4183
|
+
assert(! y.scale_equal(z), "yz")
|
4184
|
+
|
4185
|
+
x = LongDecimalQuot(Rational(3, 4), 9)
|
4186
|
+
y = LongDecimalQuot(Rational(4, 3), 9)
|
4187
|
+
z = LongDecimalQuot(Rational(4, 3), 8)
|
4188
|
+
assert(x.scale_equal(y), "xy")
|
4189
|
+
assert(y.scale_equal(x), "yx")
|
4190
|
+
assert(! x.scale_equal(z), "xz")
|
4191
|
+
assert(! y.scale_equal(z), "yz")
|
4192
|
+
assert(! z.scale_equal(x), "zx")
|
4193
|
+
assert(! z.scale_equal(y), "zy")
|
4194
|
+
end
|
4195
|
+
|
4196
|
+
def test_scale_ufo
|
4197
|
+
x = LongDecimal(3, 9)
|
4198
|
+
y = LongDecimal(4, 9)
|
4199
|
+
z = LongDecimal(4, 7)
|
4200
|
+
assert(x.scale_ufo(y) == 0, "xy")
|
4201
|
+
assert(y.scale_ufo(x) == 0, "yx")
|
4202
|
+
assert(x.scale_ufo(z) == 1, "xz")
|
4203
|
+
assert(y.scale_ufo(z) == 1, "yz")
|
4204
|
+
assert(z.scale_ufo(x) == -1, "zx")
|
4205
|
+
assert(z.scale_ufo(y) == -1, "zy")
|
4206
|
+
|
4207
|
+
x = LongDecimalQuot(Rational(3, 4), 9)
|
4208
|
+
y = LongDecimalQuot(Rational(4, 3), 9)
|
4209
|
+
z = LongDecimalQuot(Rational(4, 3), 7)
|
4210
|
+
assert(x.scale_ufo(y) == 0, "xy")
|
4211
|
+
assert(y.scale_ufo(x) == 0, "yx")
|
4212
|
+
assert(x.scale_ufo(z) == 1, "xz")
|
4213
|
+
assert(y.scale_ufo(z) == 1, "yz")
|
4214
|
+
assert(z.scale_ufo(x) == -1, "zx")
|
4215
|
+
assert(z.scale_ufo(y) == -1, "zy")
|
4216
|
+
end
|
3772
4217
|
|
3773
4218
|
end
|
3774
4219
|
|