long-decimal 0.01.01 → 0.01.02
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 +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>
|