long-decimal 0.01.01 → 0.01.02
Sign up to get free protection for your applications and to get access to all the features.
- data/README +17 -94
- data/VERSION +1 -1
- data/doc/classes/Integer.html +239 -0
- data/doc/classes/Integer.src/M000036.html +18 -0
- data/doc/classes/Integer.src/M000039.html +145 -0
- data/doc/classes/LongDecimal.html +453 -399
- data/doc/classes/LongDecimal.src/M000040.html +4 -4
- data/doc/classes/LongDecimal.src/M000041.html +4 -4
- data/doc/classes/LongDecimal.src/M000042.html +4 -6
- data/doc/classes/LongDecimal.src/M000043.html +4 -106
- data/doc/classes/LongDecimal.src/M000044.html +4 -21
- data/doc/classes/LongDecimal.src/M000045.html +4 -11
- data/doc/classes/LongDecimal.src/M000046.html +6 -27
- data/doc/classes/LongDecimal.src/M000047.html +103 -16
- data/doc/classes/LongDecimal.src/M000048.html +21 -4
- data/doc/classes/LongDecimal.src/M000049.html +10 -14
- data/doc/classes/LongDecimal.src/M000050.html +22 -36
- data/doc/classes/LongDecimal.src/M000051.html +34 -4
- data/doc/classes/LongDecimal.src/M000052.html +17 -6
- data/doc/classes/LongDecimal.src/M000053.html +4 -6
- data/doc/classes/LongDecimal.src/M000054.html +15 -4
- data/doc/classes/LongDecimal.src/M000055.html +44 -12
- data/doc/classes/LongDecimal.src/M000056.html +4 -7
- data/doc/classes/LongDecimal.src/M000057.html +8 -4
- data/doc/classes/LongDecimal.src/M000058.html +6 -15
- data/doc/classes/LongDecimal.src/M000059.html +4 -13
- data/doc/classes/LongDecimal.src/M000060.html +15 -4
- data/doc/classes/LongDecimal.src/M000061.html +7 -5
- data/doc/classes/LongDecimal.src/M000062.html +4 -4
- data/doc/classes/LongDecimal.src/M000063.html +15 -5
- data/doc/classes/LongDecimal.src/M000064.html +13 -5
- data/doc/classes/LongDecimal.src/M000065.html +4 -4
- data/doc/classes/LongDecimal.src/M000067.html +4 -8
- data/doc/classes/LongDecimal.src/M000068.html +5 -9
- data/doc/classes/LongDecimal.src/M000069.html +5 -9
- data/doc/classes/LongDecimal.src/M000070.html +4 -9
- data/doc/classes/LongDecimal.src/M000071.html +4 -4
- data/doc/classes/LongDecimal.src/M000072.html +6 -17
- data/doc/classes/LongDecimal.src/M000073.html +7 -7
- data/doc/classes/LongDecimal.src/M000074.html +7 -7
- data/doc/classes/LongDecimal.src/M000075.html +7 -19
- data/doc/classes/LongDecimal.src/M000076.html +4 -8
- data/doc/classes/LongDecimal.src/M000077.html +19 -5
- data/doc/classes/LongDecimal.src/M000078.html +7 -7
- data/doc/classes/LongDecimal.src/M000079.html +7 -7
- data/doc/classes/LongDecimal.src/M000080.html +19 -7
- data/doc/classes/LongDecimal.src/M000081.html +8 -4
- data/doc/classes/LongDecimal.src/M000082.html +5 -7
- data/doc/classes/LongDecimal.src/M000083.html +8 -6
- data/doc/classes/LongDecimal.src/M000084.html +9 -4
- data/doc/classes/LongDecimal.src/M000085.html +9 -4
- data/doc/classes/LongDecimal.src/M000086.html +4 -9
- data/doc/classes/LongDecimal.src/M000087.html +6 -8
- data/doc/classes/LongDecimal.src/M000088.html +7 -5
- data/doc/classes/LongDecimal.src/M000089.html +4 -9
- data/doc/classes/LongDecimal.src/M000090.html +4 -4
- data/doc/classes/LongDecimal.src/M000091.html +9 -4
- data/doc/classes/LongDecimal.src/M000092.html +9 -4
- data/doc/classes/LongDecimal.src/M000093.html +5 -4
- data/doc/classes/LongDecimal.src/M000094.html +7 -57
- data/doc/classes/LongDecimal.src/M000095.html +4 -4
- data/doc/classes/LongDecimal.src/M000096.html +4 -4
- data/doc/classes/LongDecimal.src/M000097.html +4 -5
- data/doc/classes/LongDecimal.src/M000098.html +4 -5
- data/doc/classes/LongDecimal.src/M000099.html +59 -5
- data/doc/classes/LongDecimal.src/M000100.html +4 -5
- data/doc/classes/LongDecimal.src/M000101.html +4 -4
- data/doc/classes/LongDecimal.src/M000104.html +19 -0
- data/doc/classes/LongDecimal.src/M000105.html +19 -0
- data/doc/classes/LongDecimal.src/M000106.html +18 -0
- data/doc/classes/LongDecimal.src/M000107.html +18 -0
- data/doc/classes/LongDecimal.src/M000108.html +18 -0
- data/doc/classes/LongDecimal.src/M000109.html +18 -0
- data/doc/classes/LongDecimalBase.html +69 -66
- data/doc/classes/LongDecimalBase.src/M000113.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000114.html +4 -5
- data/doc/classes/LongDecimalBase.src/M000115.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000116.html +4 -9
- data/doc/classes/LongDecimalBase.src/M000117.html +4 -5
- data/doc/classes/LongDecimalBase.src/M000118.html +23 -0
- data/doc/classes/LongDecimalBase.src/M000121.html +23 -0
- data/doc/classes/LongDecimalBase.src/M000122.html +19 -0
- data/doc/classes/LongDecimalBase.src/M000123.html +18 -0
- data/doc/classes/LongDecimalQuot.html +33 -27
- 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/M000030.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000031.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000034.html +1 -1
- data/doc/classes/LongDecimalQuot.src/M000035.html +1 -1
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.html +25 -24
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000156.html +22 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000157.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000158.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000159.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000161.html +25 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000162.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000163.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/RoundingModeClass.src/M000164.html +18 -0
- data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.html +178 -0
- data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000165.html +25 -0
- data/doc/classes/LongDecimalRoundingMode/ZeroRoundingModeClass.src/M000166.html +18 -0
- data/doc/classes/LongDecimalRoundingMode.html +41 -4
- data/doc/classes/LongMath/CacheKey.html +10 -10
- data/doc/classes/LongMath/CacheKey.src/M000155.html +36 -0
- data/doc/classes/LongMath/CacheKey.src/M000160.html +36 -0
- data/doc/classes/LongMath.html +246 -235
- data/doc/classes/LongMath.src/M000124.html +5 -18
- data/doc/classes/LongMath.src/M000125.html +4 -18
- data/doc/classes/LongMath.src/M000126.html +4 -5
- data/doc/classes/LongMath.src/M000127.html +5 -29
- data/doc/classes/LongMath.src/M000128.html +4 -5
- data/doc/classes/LongMath.src/M000129.html +14 -53
- data/doc/classes/LongMath.src/M000130.html +17 -20
- data/doc/classes/LongMath.src/M000131.html +5 -36
- data/doc/classes/LongMath.src/M000132.html +29 -6
- data/doc/classes/LongMath.src/M000133.html +5 -33
- data/doc/classes/LongMath.src/M000134.html +47 -41
- data/doc/classes/LongMath.src/M000135.html +21 -7
- data/doc/classes/LongMath.src/M000136.html +36 -4
- data/doc/classes/LongMath.src/M000137.html +6 -4
- data/doc/classes/LongMath.src/M000138.html +31 -70
- data/doc/classes/LongMath.src/M000139.html +45 -38
- data/doc/classes/LongMath.src/M000140.html +7 -4
- data/doc/classes/LongMath.src/M000141.html +4 -4
- data/doc/classes/LongMath.src/M000142.html +4 -6
- data/doc/classes/LongMath.src/M000143.html +67 -14
- data/doc/classes/LongMath.src/M000144.html +39 -14
- data/doc/classes/LongMath.src/M000145.html +4 -44
- data/doc/classes/LongMath.src/M000146.html +5 -339
- data/doc/classes/LongMath.src/M000147.html +6 -25
- data/doc/classes/LongMath.src/M000148.html +14 -75
- data/doc/classes/LongMath.src/M000149.html +33 -0
- data/doc/classes/LongMath.src/M000150.html +58 -0
- data/doc/classes/LongMath.src/M000151.html +406 -0
- data/doc/classes/LongMath.src/M000152.html +63 -0
- data/doc/classes/LongMath.src/M000153.html +117 -0
- data/doc/classes/LongMath.src/M000154.html +150 -0
- data/doc/classes/LongMath.src/M000155.html +63 -0
- data/doc/classes/LongMath.src/M000156.html +18 -0
- data/doc/classes/LongMath.src/M000157.html +19 -0
- data/doc/classes/LongMath.src/M000158.html +18 -0
- data/doc/classes/LongMath.src/M000159.html +19 -0
- data/doc/classes/Numeric.html +23 -21
- data/doc/classes/Numeric.src/M000106.html +18 -0
- data/doc/classes/Numeric.src/M000110.html +23 -0
- data/doc/classes/Numeric.src/M000111.html +18 -0
- data/doc/classes/Rational.html +18 -16
- data/doc/classes/Rational.src/M000107.html +23 -0
- data/doc/classes/Rational.src/M000112.html +23 -0
- data/doc/created.rid +1 -1
- data/doc/dot/f_0.dot +23 -1
- data/doc/dot/f_0.png +0 -0
- data/doc/dot/m_0_0.png +0 -0
- data/doc/dot/m_0_1.dot +13 -0
- data/doc/dot/m_0_1.png +0 -0
- data/doc/files/lib/long-decimal_rb.html +15 -13
- 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_class_index.html +2 -0
- data/doc/fr_method_index.html +131 -124
- data/lib/long-decimal.rb +373 -49
- data/test/testlongdecimal.rb +689 -7
- data/test/testlongdeclib.rb +51 -11
- data/test/testrandlib.rb +23 -7
- data/test/testrandom.rb +4 -4
- data/test/testrandpower.rb +11 -9
- metadata +48 -3
data/README
CHANGED
@@ -2,7 +2,7 @@ Version
|
|
2
2
|
-------
|
3
3
|
|
4
4
|
This version ($Name: ALPHA_01_01 $) is functionally identical with the previous
|
5
|
-
|
5
|
+
alpha-0.01.00. The runit tests have been extended and further tests
|
6
6
|
have been added. A lot of additional testing has been done using
|
7
7
|
random numbers as parameters with testrandom.rb and values for which
|
8
8
|
these random tests have failed have been added to the regular tests in
|
@@ -15,7 +15,7 @@ found directly with http://rubyforge.org/projects/long-decimal/ . So
|
|
15
15
|
you should feel encouraged to look if there is a newer version, when
|
16
16
|
you install long-decimal.
|
17
17
|
|
18
|
-
This version is
|
18
|
+
This version is an alpha-version. Operations +, -, *, / and sqrt
|
19
19
|
should be working properly and would justify calling this release at
|
20
20
|
least beta. Even log, exp and power should be fine. log, log2, log10
|
21
21
|
and exp have been tested for about a million random values and the
|
@@ -30,8 +30,8 @@ rounded up or down. Because these functions are transcendental, at
|
|
30
30
|
least exp and log will always have either one of these true, it will
|
31
31
|
never be exactly ....5. Speed could be improved as well.
|
32
32
|
|
33
|
-
It would be a good idea to do some mathematical analysis on how
|
34
|
-
digits are needed internally to guarantee the correctness of the
|
33
|
+
It would be a good idea to do some more mathematical analysis on how
|
34
|
+
many digits are needed internally to guarantee the correctness of the
|
35
35
|
digits that are provided. But this will not be considered as a
|
36
36
|
requirement for the alpha-version.
|
37
37
|
|
@@ -50,86 +50,27 @@ your machine. It is about 15 minutes on my machine (1300 MHz).
|
|
50
50
|
Whatever is gained by making the software run faster is used up again
|
51
51
|
by adding more tests. This is the result of the test:
|
52
52
|
|
53
|
-
Finished in
|
54
|
-
128 tests, 45190 assertions, 0 failures, 0 errors
|
53
|
+
Finished in 1160.808707 seconds.
|
55
54
|
|
56
|
-
|
57
|
-
long time, using the script test/testrandom.rb. This requires
|
58
|
-
installation of the ruby-library crypt-isaac for its random numbers.
|
59
|
-
If you actually want to run this and find an error with it, please
|
60
|
-
report it with the lines of output revealing the bug on
|
61
|
-
http://rubyforge.org/projects/long-decimal/ -> tracker
|
62
|
-
|
63
|
-
Install
|
64
|
-
-------
|
65
|
-
|
66
|
-
(REMARK: installation has only been successfully tested on Linux with
|
67
|
-
ruby 1.8.4 and on Windows 2000 with ruby 1.8.2)
|
68
|
-
|
69
|
-
1. Using ruby-gems (preferred)
|
70
|
-
- open a shell window
|
71
|
-
- become root, unless the current user has the right to install gems
|
72
|
-
(which is usually the case on windows)
|
73
|
-
|
74
|
-
su
|
75
|
-
|
76
|
-
- uninstall old versions
|
77
|
-
|
78
|
-
gem uninstall long-decimal
|
79
|
-
|
80
|
-
- install the newest version
|
81
|
-
|
82
|
-
gem install long-decimal
|
83
|
-
|
84
|
-
- Usage from your ruby-programs:
|
85
|
-
|
86
|
-
require "rubygems"
|
87
|
-
require_gem "long-decimal"
|
88
|
-
|
89
|
-
- documentation will be found in HTML-format in the directory
|
90
|
-
$RUBY_DIR/gems/$RUBY_VERSION/doc/long-decimal-$LONG_DECIMAL_VERSION/rdoc/index.html
|
91
|
-
where $RUBY_DIR is the directory containing your ruby-installation,
|
92
|
-
usually /usr/lib/ruby or /usr/local/lib/ruby on
|
93
|
-
Linux/Unix-systems.
|
94
|
-
$RUBY_VERSION is the major version of your Ruby, like 1.8
|
95
|
-
$LONG_DECIMAL_VERSION is the version of long-decimal that you
|
96
|
-
have installed, like 0.00.20
|
97
|
-
on my machine that would be
|
98
|
-
/usr/local/lib/ruby/gems/1.8/doc/long-decimal-0.00.20/rdoc/index.html
|
99
|
-
|
100
|
-
2. Installing from the sources (it is preferred to use the
|
101
|
-
gem-installation, but since long-decimal is open-source-software you
|
102
|
-
are off course granted the right to download the source and change
|
103
|
-
it and install your own version.
|
104
|
-
|
105
|
-
- download the newest source-tar.gz-file from long-decimal project at rubyforge
|
106
|
-
which can be found by
|
107
|
-
http://rubyforge.org/projects/long-decimal/ -> Files
|
108
|
-
( http://rubyforge.org/frs/?group_id=1334 )
|
109
|
-
- open a shell window
|
110
|
-
cd to the directory where you have downloaded the gem-file
|
111
|
-
unpack the file using tar
|
112
|
-
tar xfzvv long-decimal-alpha-1_00.tar.gz
|
113
|
-
cd long-decimal
|
114
|
-
- now you can use rake for several operations
|
115
|
-
- rake test
|
116
|
-
runs runit tests. All tests should succeed.
|
117
|
-
- rake doc
|
118
|
-
creates the documentation
|
119
|
-
- rake gem creates the gem-file in a sub-directory pkg
|
120
|
-
recommended for installation, proceed as in 1
|
121
|
-
- cd pkg
|
122
|
-
- gem install --local long-decimal
|
55
|
+
131 tests, 45612 assertions, 0 failures, 0 errors
|
123
56
|
|
57
|
+
In addition random tests for exp, exp2, exp10, sqrt, log, log2 and
|
58
|
+
log10 can be run for a long time, using the script test/testrandom.rb.
|
59
|
+
Likewise tests for powers x to the yth with random x and y can be
|
60
|
+
tested for a long time using test/testrandpower.rb
|
124
61
|
|
125
|
-
|
126
|
-
|
62
|
+
These two require installation of the ruby-library crypt-isaac for its
|
63
|
+
random numbers, which works well with Linux or Windows and Cygwin. If
|
64
|
+
you actually want to run this and find an error with it, please report
|
65
|
+
it with the lines of output revealing the bug on
|
66
|
+
http://rubyforge.org/projects/long-decimal/ -> tracker
|
127
67
|
|
128
68
|
Install
|
129
69
|
-------
|
130
70
|
|
131
71
|
(REMARK: installation has only been successfully tested on Linux with
|
132
|
-
ruby 1.8.4 and on Windows
|
72
|
+
ruby 1.8.4 and on Windows XP with Cygwin and ruby 1.8.4 and on Windows
|
73
|
+
2000 with ruby 1.8.2)
|
133
74
|
|
134
75
|
1. Using ruby-gems (preferred)
|
135
76
|
- open a shell window
|
@@ -190,24 +131,6 @@ ruby 1.8.4 and on Windows 2000 with ruby 1.8.2)
|
|
190
131
|
3. The documentation can be created from the sources. It is contained
|
191
132
|
in the gem-file. It is not provided as a separate file any more.
|
192
133
|
|
193
|
-
Test
|
194
|
-
----
|
195
|
-
|
196
|
-
Some runit tests have been included. They give some indication of the
|
197
|
-
correctness of this library and allow changes to be checked in order
|
198
|
-
to make sure that what was running before would still work afterwards.
|
199
|
-
Tests for a library as complex as long-decimal can never be
|
200
|
-
exhaustive, but they give a good indication that methods are working
|
201
|
-
correctly. About 95% of the tests that will be eventually needed are
|
202
|
-
already present. As a policy a release is not created unless all
|
203
|
-
tests succeed. Running the tests can take a few minutes, depending on
|
204
|
-
your machine. It is about 15 minutes on my machine (1300 MHz).
|
205
|
-
Whatever is gained by making the software run faster is used up again
|
206
|
-
by adding more tests. This is the result of the test:
|
207
|
-
|
208
|
-
Finished in 1131.2352 seconds.
|
209
|
-
128 tests, 45190 assertions, 0 failures, 0 errors
|
210
|
-
|
211
134
|
Bugs
|
212
135
|
----
|
213
136
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.01.
|
1
|
+
0.01.02
|
@@ -0,0 +1,239 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Class: Integer</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Class</strong></td>
|
53
|
+
<td class="class-name-in-header">Integer</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../files/lib/long-decimal_rb.html">
|
59
|
+
lib/long-decimal.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
</td>
|
63
|
+
</tr>
|
64
|
+
|
65
|
+
<tr class="top-aligned-row">
|
66
|
+
<td><strong>Parent:</strong></td>
|
67
|
+
<td>
|
68
|
+
Object
|
69
|
+
</td>
|
70
|
+
</tr>
|
71
|
+
</table>
|
72
|
+
</div>
|
73
|
+
<!-- banner header -->
|
74
|
+
|
75
|
+
<div id="bodyContent">
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
<div id="contextContent">
|
80
|
+
<div id="diagram">
|
81
|
+
<map id="map" name="map">
|
82
|
+
<area shape="rect" coords="94,7,171,55" href="Comparable.html" alt="Comparable" />
|
83
|
+
<area shape="rect" coords="158,206,235,254" href="LongMath/CacheKey.html" alt="CacheKey" />
|
84
|
+
<area shape="rect" coords="231,103,356,151" href="LongDecimalRoundingMode/RoundingModeClass.html" alt="RoundingModeClass" />
|
85
|
+
<area shape="rect" coords="58,103,207,151" href="LongDecimalRoundingMode/ZeroRoundingModeClass.html" alt="ZeroRoundingModeClass" />
|
86
|
+
<area shape="rect" coords="355,206,470,254" href="LongDecimalBase.html" alt="LongDecimalBase" />
|
87
|
+
<area shape="rect" coords="294,302,406,350" href="LongDecimalQuot.html" alt="LongDecimalQuot" />
|
88
|
+
<area shape="rect" coords="195,7,267,55" href="Integer.html" alt="Integer" />
|
89
|
+
<area shape="rect" coords="430,302,520,350" href="LongDecimal.html" alt="LongDecimal" />
|
90
|
+
<area shape="rect" coords="407,103,479,151" href="Numeric.html" alt="Numeric" />
|
91
|
+
<area shape="rect" coords="291,7,363,55" href="Rational.html" alt="Rational" />
|
92
|
+
<area shape="rect" coords="147,172,272,264" href="LongMath.html" alt="LongMath" />
|
93
|
+
<area shape="rect" coords="47,70,394,162" href="LongDecimalRoundingMode.html" alt="LongDecimalRoundingMode" />
|
94
|
+
</map>
|
95
|
+
<img src="../dot/f_0.png" usemap="#map" border="0" alt="dot/f_0.png">
|
96
|
+
</div>
|
97
|
+
|
98
|
+
<div id="description">
|
99
|
+
<p>
|
100
|
+
add one method to <a href="Integer.html">Integer</a>
|
101
|
+
</p>
|
102
|
+
|
103
|
+
</div>
|
104
|
+
|
105
|
+
|
106
|
+
</div>
|
107
|
+
|
108
|
+
<div id="method-list">
|
109
|
+
<h3 class="section-bar">Methods</h3>
|
110
|
+
|
111
|
+
<div class="name-list">
|
112
|
+
<a href="#M000039">round_to_allowed_remainders</a>
|
113
|
+
<a href="#M000036">sgn</a>
|
114
|
+
<a href="#M000038">sign</a>
|
115
|
+
<a href="#M000037">signum</a>
|
116
|
+
</div>
|
117
|
+
</div>
|
118
|
+
|
119
|
+
</div>
|
120
|
+
|
121
|
+
|
122
|
+
<!-- if includes -->
|
123
|
+
|
124
|
+
<div id="section">
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
<!-- if method_list -->
|
134
|
+
<div id="methods">
|
135
|
+
<h3 class="section-bar">Public Instance methods</h3>
|
136
|
+
|
137
|
+
<div id="method-M000039" class="method-detail">
|
138
|
+
<a name="M000039"></a>
|
139
|
+
|
140
|
+
<div class="method-heading">
|
141
|
+
<a href="Integer.src/M000039.html" target="Code" class="method-signature"
|
142
|
+
onclick="popupCode('Integer.src/M000039.html');return false;">
|
143
|
+
<span class="method-name">round_to_allowed_remainders</span><span class="method-args">(remainders, modulus, rounding_mode = LongDecimalRoundingMode::ROUND_UNNECESSARY, zero_rounding_mode = LongDecimalRoundingMode::ZERO_ROUND_UNNECESSARY)</span>
|
144
|
+
</a>
|
145
|
+
</div>
|
146
|
+
|
147
|
+
<div class="method-description">
|
148
|
+
<p>
|
149
|
+
create copy of self round in such a way that the result is congruent modulo
|
150
|
+
modulus to one of the members of remainders
|
151
|
+
</p>
|
152
|
+
<p>
|
153
|
+
param1: remainders array of allowed remainders param2: modulus modulus of
|
154
|
+
the remainders param3: rounding_mode rounding mode to be applied when
|
155
|
+
information is
|
156
|
+
</p>
|
157
|
+
<pre>
|
158
|
+
lost. defaults to ROUND_UNNECESSARY, which
|
159
|
+
means that an exception is thrown if rounding
|
160
|
+
would actually loose any information.
|
161
|
+
</pre>
|
162
|
+
<p>
|
163
|
+
param4: zero_rounding_mode if self is zero, but zero is not among
|
164
|
+
</p>
|
165
|
+
<pre>
|
166
|
+
the available remainders, it has to be
|
167
|
+
rounded to positive or negative value.
|
168
|
+
If the rounding_mode does not allow to
|
169
|
+
determine which of the two values to
|
170
|
+
use, zero_rounding_mode has to be used
|
171
|
+
to decide.
|
172
|
+
</pre>
|
173
|
+
</div>
|
174
|
+
</div>
|
175
|
+
|
176
|
+
<div id="method-M000036" class="method-detail">
|
177
|
+
<a name="M000036"></a>
|
178
|
+
|
179
|
+
<div class="method-heading">
|
180
|
+
<a href="Integer.src/M000036.html" target="Code" class="method-signature"
|
181
|
+
onclick="popupCode('Integer.src/M000036.html');return false;">
|
182
|
+
<span class="method-name">sgn</span><span class="method-args">()</span>
|
183
|
+
</a>
|
184
|
+
</div>
|
185
|
+
|
186
|
+
<div class="method-description">
|
187
|
+
<p>
|
188
|
+
get the <a href="Integer.html#M000038">sign</a> of self -1 if self < 0
|
189
|
+
</p>
|
190
|
+
<pre>
|
191
|
+
0 if self is 0 (with any number of 0s after the decimal point)
|
192
|
+
</pre>
|
193
|
+
<p>
|
194
|
+
+1 if self > 0
|
195
|
+
</p>
|
196
|
+
</div>
|
197
|
+
</div>
|
198
|
+
|
199
|
+
<div id="method-M000038" class="method-detail">
|
200
|
+
<a name="M000038"></a>
|
201
|
+
|
202
|
+
<div class="method-heading">
|
203
|
+
<span class="method-name">sign</span><span class="method-args">()</span>
|
204
|
+
</div>
|
205
|
+
|
206
|
+
<div class="method-description">
|
207
|
+
<p>
|
208
|
+
Alias for <a href="Integer.html#M000036">sgn</a>
|
209
|
+
</p>
|
210
|
+
</div>
|
211
|
+
</div>
|
212
|
+
|
213
|
+
<div id="method-M000037" class="method-detail">
|
214
|
+
<a name="M000037"></a>
|
215
|
+
|
216
|
+
<div class="method-heading">
|
217
|
+
<span class="method-name">signum</span><span class="method-args">()</span>
|
218
|
+
</div>
|
219
|
+
|
220
|
+
<div class="method-description">
|
221
|
+
<p>
|
222
|
+
Alias for <a href="Integer.html#M000036">sgn</a>
|
223
|
+
</p>
|
224
|
+
</div>
|
225
|
+
</div>
|
226
|
+
|
227
|
+
|
228
|
+
</div>
|
229
|
+
|
230
|
+
|
231
|
+
</div>
|
232
|
+
|
233
|
+
|
234
|
+
<div id="validator-badges">
|
235
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
236
|
+
</div>
|
237
|
+
|
238
|
+
</body>
|
239
|
+
</html>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>sgn (Integer)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 154</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sgn</span>
|
15
|
+
<span class="ruby-keyword kw">self</span> <span class="ruby-operator"><=></span> <span class="ruby-value">0</span>
|
16
|
+
<span class="ruby-keyword kw">end</span></pre>
|
17
|
+
</body>
|
18
|
+
</html>
|
@@ -0,0 +1,145 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html>
|
7
|
+
<head>
|
8
|
+
<title>round_to_allowed_remainders (Integer)</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
|
11
|
+
</head>
|
12
|
+
<body class="standalone-code">
|
13
|
+
<pre><span class="ruby-comment cmt"># File lib/long-decimal.rb, line 179</span>
|
14
|
+
<span class="ruby-keyword kw">def</span> <span class="ruby-identifier">round_to_allowed_remainders</span>(<span class="ruby-identifier">remainders</span>,
|
15
|
+
<span class="ruby-identifier">modulus</span>,
|
16
|
+
<span class="ruby-identifier">rounding_mode</span> = <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_UNNECESSARY</span>,
|
17
|
+
<span class="ruby-identifier">zero_rounding_mode</span> = <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_UNNECESSARY</span>)
|
18
|
+
|
19
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-value str">"remainders must be Array"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Array</span>
|
20
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-value str">"remainders must be non-empty Array"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
|
21
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"modulus #{modulus.inspect} must be integer"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">modulus</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
|
22
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"modulus #{modulus.inspect} must be >= 2"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">modulus</span> <span class="ruby-operator">>=</span> <span class="ruby-value">2</span>
|
23
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"rounding_mode #{rounding_mode.inspect} must be legal rounding rounding_mode"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">rounding_mode</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">RoundingModeClass</span>
|
24
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-value str">"ROUND_HALF_EVEN is not applicable here"</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_EVEN</span>
|
25
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-node">"zero_rounding_mode #{zero_rounding_mode.inspect} must be legal zero_rounding zero_rounding_mode"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">zero_rounding_mode</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZeroRoundingModeClass</span>
|
26
|
+
|
27
|
+
<span class="ruby-identifier">r_self</span> = <span class="ruby-keyword kw">self</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">modulus</span>
|
28
|
+
<span class="ruby-identifier">r_self_00</span> = <span class="ruby-identifier">r_self</span>
|
29
|
+
<span class="ruby-identifier">remainders</span> = <span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">collect</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
|
30
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">TypeError</span>, <span class="ruby-value str">"remainders must be numbers"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Integer</span>
|
31
|
+
<span class="ruby-identifier">r</span> <span class="ruby-operator">%</span> <span class="ruby-identifier">modulus</span>
|
32
|
+
<span class="ruby-keyword kw">end</span>
|
33
|
+
<span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">sort!</span>.<span class="ruby-identifier">uniq!</span>
|
34
|
+
<span class="ruby-identifier">r_first</span> = <span class="ruby-identifier">remainders</span>[<span class="ruby-value">0</span>]
|
35
|
+
<span class="ruby-identifier">r_last</span> = <span class="ruby-identifier">remainders</span>[<span class="ruby-value">-1</span>]
|
36
|
+
<span class="ruby-identifier">r_first_again</span> = <span class="ruby-identifier">r_first</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">modulus</span>
|
37
|
+
<span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">push</span> <span class="ruby-identifier">r_first_again</span>
|
38
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">r_self</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">r_first</span>) <span class="ruby-keyword kw">then</span>
|
39
|
+
<span class="ruby-identifier">r_self</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">modulus</span>
|
40
|
+
<span class="ruby-keyword kw">end</span>
|
41
|
+
<span class="ruby-comment cmt"># puts "r_self=#{r_self_00}->#{r_self} r_first=#{r_first} r_last=#{r_last} r_first_again=#{r_first_again}"</span>
|
42
|
+
<span class="ruby-identifier">r_lower</span> = <span class="ruby-value">-1</span>
|
43
|
+
<span class="ruby-identifier">r_upper</span> = <span class="ruby-value">-1</span>
|
44
|
+
<span class="ruby-identifier">remainders</span>.<span class="ruby-identifier">each_index</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
|
45
|
+
<span class="ruby-identifier">r</span> = <span class="ruby-identifier">remainders</span>[<span class="ruby-identifier">i</span>]
|
46
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">r</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">r_self</span>) <span class="ruby-keyword kw">then</span>
|
47
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">self</span>
|
48
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">r</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">r_self</span>) <span class="ruby-keyword kw">then</span>
|
49
|
+
<span class="ruby-identifier">r_lower</span> = <span class="ruby-identifier">r</span>
|
50
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">r</span> <span class="ruby-operator">></span> <span class="ruby-identifier">r_self</span>) <span class="ruby-keyword kw">then</span>
|
51
|
+
<span class="ruby-identifier">r_upper</span> = <span class="ruby-identifier">r</span>
|
52
|
+
<span class="ruby-keyword kw">break</span>
|
53
|
+
<span class="ruby-keyword kw">end</span>
|
54
|
+
<span class="ruby-keyword kw">end</span>
|
55
|
+
<span class="ruby-identifier">lower</span> = <span class="ruby-keyword kw">self</span> <span class="ruby-operator">-</span> (<span class="ruby-identifier">r_self</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">r_lower</span>)
|
56
|
+
<span class="ruby-identifier">upper</span> = <span class="ruby-keyword kw">self</span> <span class="ruby-operator">+</span> (<span class="ruby-identifier">r_upper</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">r_self</span>)
|
57
|
+
<span class="ruby-comment cmt"># puts "r_lower=#{r_lower} r_upper=#{r_upper} lower=#{lower} upper=#{upper} s=#{self}"</span>
|
58
|
+
|
59
|
+
<span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">lower</span> <span class="ruby-operator"><</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator">&&</span> <span class="ruby-keyword kw">self</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">upper</span>)
|
60
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Error</span>, <span class="ruby-node">"self=#{self} not in (#{lower}, #{upper})"</span>
|
61
|
+
<span class="ruby-keyword kw">end</span>
|
62
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_UNNECESSARY</span>) <span class="ruby-keyword kw">then</span>
|
63
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">"mode ROUND_UNNECESSARY not applicable, self=#{self.to_s} is in open interval (#{lower}, #{upper})"</span>
|
64
|
+
<span class="ruby-keyword kw">end</span>
|
65
|
+
|
66
|
+
<span class="ruby-comment cmt"># if (rounding_mode == LongDecimalRoundingMode::ROUND_FLOOR) then</span>
|
67
|
+
<span class="ruby-comment cmt"># return lower</span>
|
68
|
+
<span class="ruby-comment cmt"># elsif (rounding_mode == LongDecimalRoundingMode::ROUND_CEILING) then</span>
|
69
|
+
<span class="ruby-comment cmt"># return upper</span>
|
70
|
+
<span class="ruby-comment cmt"># end</span>
|
71
|
+
|
72
|
+
<span class="ruby-identifier">sign_self</span> = <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">sign</span>
|
73
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">sign_self</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
|
74
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_UP</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_DOWN</span> \
|
75
|
+
<span class="ruby-operator">||</span> <span class="ruby-identifier">lower</span> <span class="ruby-operator">==</span> <span class="ruby-operator">-</span><span class="ruby-identifier">upper</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_UP</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>))
|
76
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_UNNECESSARY</span>) <span class="ruby-keyword kw">then</span>
|
77
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">ArgumentError</span>, <span class="ruby-node">"self=#{self.to_s} is 0 in open interval (#{lower}, #{upper}) and cannot be resolved with ZERO_ROUND_UNNECESSARY"</span>
|
78
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_CLOSEST_PREFER_PLUS</span> \
|
79
|
+
<span class="ruby-operator">||</span> <span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_CLOSEST_PREFER_MINUS</span>) <span class="ruby-keyword kw">then</span>
|
80
|
+
<span class="ruby-identifier">diff</span> = <span class="ruby-identifier">lower</span>.<span class="ruby-identifier">abs</span> <span class="ruby-operator"><=></span> <span class="ruby-identifier">upper</span>.<span class="ruby-identifier">abs</span>
|
81
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">diff</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
|
82
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">lower</span>
|
83
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">diff</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>) <span class="ruby-keyword kw">then</span>
|
84
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">upper</span>
|
85
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_CLOSEST_PREFER_PLUS</span>) <span class="ruby-keyword kw">then</span>
|
86
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">upper</span>
|
87
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_CLOSEST_PREFER_MINUS</span>) <span class="ruby-keyword kw">then</span>
|
88
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">lower</span>
|
89
|
+
<span class="ruby-keyword kw">else</span>
|
90
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Error</span>, <span class="ruby-node">"this case can never happen: zero_rounding_mode=#{zero_rounding_mode}"</span>
|
91
|
+
<span class="ruby-keyword kw">end</span>
|
92
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_PLUS</span>) <span class="ruby-keyword kw">then</span>
|
93
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">upper</span>
|
94
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">zero_rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ZERO_ROUND_TO_MINUS</span>) <span class="ruby-keyword kw">then</span>
|
95
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">lower</span>
|
96
|
+
<span class="ruby-keyword kw">else</span>
|
97
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Error</span>, <span class="ruby-node">"this case can never happen: zero_rounding_mode=#{zero_rounding_mode}"</span>
|
98
|
+
<span class="ruby-keyword kw">end</span>
|
99
|
+
<span class="ruby-keyword kw">end</span>
|
100
|
+
<span class="ruby-keyword kw">end</span>
|
101
|
+
|
102
|
+
<span class="ruby-comment cmt"># now we can assume that sign_self (and self) is != 0, which allows to decide on the rounding_mode</span>
|
103
|
+
|
104
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_UP</span>)
|
105
|
+
<span class="ruby-comment cmt"># ROUND_UP goes to the closest possible value away from zero</span>
|
106
|
+
<span class="ruby-identifier">rounding_mode</span> = (<span class="ruby-identifier">sign_self</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_FLOOR</span> <span class="ruby-operator">:</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_CEILING</span>
|
107
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_DOWN</span>)
|
108
|
+
<span class="ruby-comment cmt"># ROUND_DOWN goes to the closest possible value towards zero or beyond zero</span>
|
109
|
+
<span class="ruby-identifier">rounding_mode</span> = (<span class="ruby-identifier">sign_self</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_CEILING</span> <span class="ruby-operator">:</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_FLOOR</span>
|
110
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_UP</span>)
|
111
|
+
<span class="ruby-comment cmt"># ROUND_HALF_UP goes to the closest possible value preferring away from zero</span>
|
112
|
+
<span class="ruby-identifier">rounding_mode</span> = (<span class="ruby-identifier">sign_self</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_FLOOR</span> <span class="ruby-operator">:</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_CEILING</span>
|
113
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_DOWN</span>)
|
114
|
+
<span class="ruby-comment cmt"># ROUND_HALF_DOWN goes to the closest possible value preferring towards zero or beyond zero</span>
|
115
|
+
<span class="ruby-identifier">rounding_mode</span> = (<span class="ruby-identifier">sign_self</span> <span class="ruby-operator"><</span> <span class="ruby-value">0</span>) <span class="ruby-operator">?</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_CEILING</span> <span class="ruby-operator">:</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_FLOOR</span>
|
116
|
+
<span class="ruby-keyword kw">end</span>
|
117
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_FLOOR</span> \
|
118
|
+
<span class="ruby-operator">||</span> <span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_CEILING</span>) <span class="ruby-keyword kw">then</span>
|
119
|
+
<span class="ruby-identifier">d_lower</span> = <span class="ruby-keyword kw">self</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">lower</span>
|
120
|
+
<span class="ruby-identifier">d_upper</span> = <span class="ruby-identifier">upper</span> <span class="ruby-operator">-</span> <span class="ruby-keyword kw">self</span>
|
121
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">d_lower</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">d_upper</span>) <span class="ruby-keyword kw">then</span>
|
122
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">lower</span>
|
123
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">d_upper</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">d_lower</span>) <span class="ruby-keyword kw">then</span>
|
124
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">upper</span>
|
125
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_FLOOR</span>) <span class="ruby-keyword kw">then</span>
|
126
|
+
<span class="ruby-identifier">rounding_mode</span> = <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_FLOOR</span>
|
127
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_HALF_CEILING</span>) <span class="ruby-keyword kw">then</span>
|
128
|
+
<span class="ruby-identifier">rounding_mode</span> = <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_CEILING</span>
|
129
|
+
<span class="ruby-keyword kw">else</span>
|
130
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Error</span>, <span class="ruby-node">"this case can never happen: rounding_mode=#{rounding_mode}"</span>
|
131
|
+
<span class="ruby-keyword kw">end</span>
|
132
|
+
<span class="ruby-keyword kw">end</span>
|
133
|
+
|
134
|
+
<span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_FLOOR</span>) <span class="ruby-keyword kw">then</span>
|
135
|
+
<span class="ruby-comment cmt"># puts "floor/lower r_lower=#{r_lower} r_upper=#{r_upper} lower=#{lower} upper=#{upper} s=#{self}"</span>
|
136
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">lower</span>
|
137
|
+
<span class="ruby-keyword kw">elsif</span> (<span class="ruby-identifier">rounding_mode</span> <span class="ruby-operator">==</span> <span class="ruby-constant">LongDecimalRoundingMode</span><span class="ruby-operator">::</span><span class="ruby-constant">ROUND_CEILING</span>) <span class="ruby-keyword kw">then</span>
|
138
|
+
<span class="ruby-comment cmt"># puts "ceiling/upper r_lower=#{r_lower} r_upper=#{r_upper} lower=#{lower} upper=#{upper} s=#{self}"</span>
|
139
|
+
<span class="ruby-keyword kw">return</span> <span class="ruby-identifier">upper</span>
|
140
|
+
<span class="ruby-keyword kw">else</span>
|
141
|
+
<span class="ruby-identifier">raise</span> <span class="ruby-constant">Error</span>, <span class="ruby-node">"this case can never happen: rounding_mode=#{rounding_mode}"</span>
|
142
|
+
<span class="ruby-keyword kw">end</span>
|
143
|
+
<span class="ruby-keyword kw">end</span></pre>
|
144
|
+
</body>
|
145
|
+
</html>
|