annotate src/decimal/decimal.d @ 1:a984d3056cc4

Incorporated Boost License
author Paul (paul.d.anderson@comcast.net)
date Sat, 13 Mar 2010 18:51:22 -0800
parents 42cf4db6be32
children bfda0b347c07
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
1 /**
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
2 * A D programming language implementation of the
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
3 * General Decimal Arithmetic Specification,
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
4 * Version 1.70, (25 March 2009).
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
5 *
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
6 * by Paul D. Anderson
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
7 *
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
8 * Boost Software License - Version 1.0 - August 17th, 2003
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
9 *
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
10 * Permission is hereby granted, free of charge, to any person or organization
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
11 * obtaining a copy of the software and accompanying documentation covered by
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
12 * this license (the "Software") to use, reproduce, display, distribute,
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
13 * execute, and transmit the Software, and to prepare derivative works of the
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
14 * Software, and to permit third-parties to whom the Software is furnished to
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
15 * do so, all subject to the following:
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
16 *
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
17 * The copyright notices in the Software and this entire statement, including
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
18 * the above license grant, this restriction and the following disclaimer,
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
19 * must be included in all copies of the Software, in whole or in part, and
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
20 * all derivative works of the Software, unless such copies or derivative
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
21 * works are solely in the form of machine-executable object code generated by
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
22 * a source language processor.
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
23 *
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
26 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
27 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
28 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
29 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
30 * DEALINGS IN THE SOFTWARE.
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
31 **/
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
32
a984d3056cc4 Incorporated Boost License
Paul (paul.d.anderson@comcast.net)
parents: 0
diff changeset
33 // TODO: ensure context flags are being set and cleared properly.
0
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
34
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
35 // TODO: add exp() add sqrt() add power():
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
36
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
37 // TODO: add a set/getPayload to Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
38
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
39 // TODO: unittest opPostDec && opPostInc.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
40
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
41 // TODO: this(str): add tests for just over/under int.max, int.min
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
42
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
43 // TODO: organize by structs, lib functions modules functions, etc.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
44
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
45 // TODO: opEquals unit test should include numerically equal testing.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
46
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
47 // TODO: write some test cases for flag setting. test the add/sub/mul/div functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
48
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
49 // TODO: to/from real or double (float) values needs definition and implementation.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
50
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
51 // TODO: need to determine the property name for dig and/or digits
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
52
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
53 module decimal.decimal;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
54
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
55 import decimal.context;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
56 import std.bigint;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
57 import std.conv;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
58 import std.ctype: isdigit;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
59 import std.math: PI, LOG2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
60 import std.stdio: write, writeln;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
61 import std.string;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
62
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
63 // special values
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
64 private enum SpVal {CLEAR, ZERO, INF, QNAN, SNAN};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
65
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
66 // common decimal "numbers"
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
67 public:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
68 static immutable Decimal ONE = {spval:SpVal.CLEAR, ceff:{[1]}};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
69 static immutable Decimal TEN = {spval:SpVal.CLEAR, ceff:{[10]}};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
70 static immutable Decimal NaN = {spval:SpVal.QNAN};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
71 static immutable Decimal POS_INF = {spval:SpVal.INF};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
72 static immutable Decimal NEG_INF = {sign:true, SpVal.INF};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
73 static immutable Decimal ZERO = {spval:SpVal.ZERO};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
74 static immutable Decimal NEG_ZERO = {sign:true, SpVal.ZERO};
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
75
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
76 // active context
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
77 public DecimalContext context = DEFAULT_CONTEXT;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
78
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
79 // singleton ContextStack
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
80 private ContextStack contextStack;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
81
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
82 /// saves the current context
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
83 public void pushContext() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
84 contextStack.push();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
85 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
86
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
87 /// restores the previous context
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
88 public void popContext() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
89 contextStack.pop();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
90 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
91
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
92 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
93 * A struct representing an arbitrary-precision floating-point number.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
94 *
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
95 * The implementation follows the General Decimal Arithmetic
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
96 * Specification, Version 1.70 (25 Mar 2009),
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
97 * http://www.speleotrove.com/decimal. This specification conforms with
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
98 * IEEE standard 754-2008.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
99 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
100 struct Decimal {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
101
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
102 private:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
103 SpVal spval = SpVal.QNAN; // special values: default value is quiet NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
104 bool sign = false; // true if the value is negative, false otherwise.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
105 int expo = 0; // the exponent of the Decimal value
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
106 BigInt ceff; // the coefficient of the Decimal value
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
107 // NOTE: not a uint -- causes math problems down the line.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
108 int digits; // the number of decimal digits in this number.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
109 // (unless the number is a special value)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
110
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
111 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
112 // construction
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
113 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
114
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
115 public:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
116 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
117 * Constructs a Decimal number from a sign, a BigInt coefficient and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
118 * an integer exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
119 * The precision of the number is deduced from the number of decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
120 * digits in the coefficient.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
121 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
122 this(const bool sign, const BigInt coefficient, const int exponent) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
123 this.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
124 if (coefficient < BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
125 this.sign = !sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
126 this.ceff = -coefficient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
127 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
128 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
129 this.sign = sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
130 this.ceff = coefficient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
131 if (coefficient == BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
132 this.spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
133 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
134 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
135 this.expo = exponent;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
136 this.digits = numDigits(this.ceff, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
137 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
138
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
139 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
140 * Constructs a Decimal number from a sign, an integer coefficient and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
141 * an integer exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
142 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
143 this(const bool sign, const int coefficient, const int exponent) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
144 this(sign, BigInt(coefficient), exponent);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
145 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
146
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
147 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
148 * Constructs a Decimal number from a sign, a special value string and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
149 * an optional payload.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
150 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
151 this(const bool sign, string str, const uint payload = 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
152 this.clear();;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
153 this.sign = sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
154 if (icmp(str, "inf") == 0 || icmp(str, "infinity") == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
155 spval = SpVal.INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
156 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
157 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
158 if (icmp(str, "snan") == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
159 spval = SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
160 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
161 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
162 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
163 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
164 ceff = payload;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
165 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
166
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
167 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
168 * Constructs a Decimal from a BigInt coefficient and an int exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
169 * The sign of the number is the sign of the coefficient.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
170 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
171 this(const BigInt coefficient, const int exponent) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
172 this(false, coefficient, exponent);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
173 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
174
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
175 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
176 * Constructs a Decimal from a BigInt.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
177 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
178 this(const BigInt coefficient) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
179 this(coefficient, 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
180 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
181
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
182 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
183 * Constructs a Decimal from an integer coefficient and an integer exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
184 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
185 this(const long coefficient, const int exponent) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
186 this(BigInt(coefficient), exponent);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
187 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
188
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
189 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
190 * Constructs a Decimal from an integer value.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
191 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
192 this(const long coefficient) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
193 this(BigInt(coefficient), 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
194 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
195
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
196 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
197 * Constructs a Decimal from an integer coefficient, exponent and precision.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
198 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
199 // TODO: should this set flags? probably not.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
200 this(const long coefficient, const int exponent, const int precision) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
201 this(coefficient, exponent);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
202 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
203 context.precision = precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
204 setDigits(this);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
205 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
206 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
207
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
208 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
209 * Constructs a Decimal from a real value.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
210 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
211 this(const real r) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
212 string str = format("%.*G", cast(int)context.precision, r);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
213 this = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
214 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
215
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
216 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
217 * Constructs a Decimal from a double value.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
218 * Set to the specified precision
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
219 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
220 this(const real r, int precision) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
221 string str = format("%.*E", precision, r);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
222 this = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
223 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
224
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
225 // copy constructor
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
226 this(const Decimal that) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
227 this = that;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
228 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
229
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
230 // construct from string representation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
231 this(const string str) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
232 this = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
233 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
234
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
235 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
236 write("construction.");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
237 Decimal f = Decimal(BigInt(1234), 567);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
238 assert(f.toString() == "1.234E+570");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
239 f = Decimal(BigInt(1234));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
240 assert(f.toString() == "1234");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
241 f = Decimal(BigInt(123400));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
242 assert(f.toString() == "123400");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
243 f = Decimal(1234, 567);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
244 assert(f.toString() == "1.234E+570");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
245 f = Decimal(BigInt(1234));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
246 assert(f.toString() == "1234");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
247 f = Decimal(1234, 0, 9);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
248 assert(f.toString() == "1234.00000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
249 Decimal dec = Decimal(1234, 1, 9);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
250 assert(dec.toString() == "12340.0000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
251 dec = Decimal(12, 1, 9);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
252 assert(dec.toString() == "120.000000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
253 dec = Decimal(int.max, -4, 9);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
254 assert(dec.toString() == "214748.365");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
255 dec = Decimal(int.max, -4);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
256 assert(dec.toString() == "214748.3647");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
257 dec = Decimal(1234567, -2, 5);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
258 assert(dec.toString() == "12346");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
259 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
260 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
261
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
262 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
263 write("this(str)....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
264 Decimal f;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
265 string str = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
266 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
267 assert(f.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
268 assert(f.toAbstract() == "[0,0,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
269 str = "0.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
270 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
271 assert(f.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
272 assert(f.toAbstract() == "[0,0,-2]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
273 str = "0.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
274 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
275 assert(f.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
276 assert(f.toAbstract() == "[0,0,-1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
277 f = "0.";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
278 assert(f.toString() == "0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
279 assert(f.toAbstract() == "[0,0,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
280 f = ".0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
281 assert(f.toString() == "0.0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
282 assert(f.toAbstract() == "[0,0,-1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
283 str = "1.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
284 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
285 assert(f.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
286 assert(f.toAbstract() == "[0,10,-1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
287 str = "1.";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
288 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
289 assert(f.toString() == "1");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
290 assert(f.toAbstract() == "[0,1,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
291 str = ".1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
292 f = str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
293 assert(f.toString() == "0.1");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
294 assert(f.toAbstract() == "[0,1,-1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
295 f = Decimal("123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
296 assert(f.toString() == "123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
297 f = Decimal("-123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
298 assert(f.toString() == "-123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
299 f = Decimal("1.23E3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
300 assert(f.toString() == "1.23E+3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
301 f = Decimal("1.23E");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
302 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
303 f = Decimal("1.23E-");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
304 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
305 f = Decimal("1.23E+");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
306 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
307 f = Decimal("1.23E+3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
308 assert(f.toString() == "1.23E+3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
309 f = Decimal("1.23E3B");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
310 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
311 f = Decimal("12.3E+007");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
312 assert(f.toString() == "1.23E+8");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
313 f = Decimal("12.3E+70000000000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
314 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
315 f = Decimal("12.3E+7000000000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
316 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
317 f = Decimal("12.3E+700000000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
318 // writeln(f.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
319 assert(f.toString() == "1.23E+700000001");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
320 f = Decimal("12.3E-700000000");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
321 // writeln(f.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
322 assert(f.toString() == "1.23E-699999999");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
323 // NOTE: since there will still be adjustments -- maybe limit to 99999999?
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
324 f = Decimal("12.0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
325 assert(f.toString() == "12.0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
326 f = Decimal("12.3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
327 assert(f.toString() == "12.3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
328 f = Decimal("1.23E-3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
329 assert(f.toString() == "0.00123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
330 f = Decimal("0.00123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
331 assert(f.toString() == "0.00123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
332 f = Decimal("-1.23E-12");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
333 assert(f.toString() == "-1.23E-12");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
334 f = Decimal("-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
335 assert(f.toString() == "-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
336 f = Decimal("inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
337 assert(f.toString() == "Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
338 f = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
339 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
340 f = Decimal("-NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
341 assert(f.toString() == "-NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
342 f = Decimal("sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
343 assert(f.toString() == "sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
344 f = Decimal("Fred");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
345 assert(f.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
346 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
347 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
348
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
349 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
350 * dup property
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
351 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
352 const Decimal dup() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
353 Decimal cp;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
354 cp.sign = sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
355 cp.spval = spval;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
356 cp.ceff = ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
357 cp.expo = expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
358 return cp;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
359 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
360
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
361 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
362 // assignment
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
363 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
364
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
365 /// Assigns a Decimal (makes a copy)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
366 void opAssign(const Decimal that) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
367 this.sign = that.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
368 this.spval = that.spval;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
369 this.digits = that.digits;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
370 this.expo = that.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
371 this.ceff = that.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
372 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
373
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
374 /// Assigns a floating point value.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
375 void opAssign(const real r) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
376 this = Decimal(r);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
377 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
378
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
379 /// Assign an integer value
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
380 void opAssign(const long n) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
381 spval = (n == 0) ? SpVal.ZERO : SpVal.CLEAR;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
382 sign = n < 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
383 ceff = sign ? -n : n;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
384 expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
385 digits = numDigits(ceff, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
386 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
387
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
388 /// Assign a BigInt
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
389 void opAssign(const BigInt big) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
390 spval = (big == BIG_ZERO) ? SpVal.ZERO : SpVal.CLEAR;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
391 sign = big < 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
392 ceff = sign ? -big : big;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
393 expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
394 digits = numDigits(ceff, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
395 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
396
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
397 /// Assigns a string
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
398 void opAssign(const string numeric_string) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
399 clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
400 sign = false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
401
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
402 // strip, copy, tolower
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
403 char[] str = strip(numeric_string).dup;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
404 tolowerInPlace(str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
405
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
406 // get sign, if any
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
407 if (startsWith(str,"-")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
408 sign = true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
409 str = str[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
410 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
411 else if (startsWith(str,"+")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
412 str = str[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
413 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
414
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
415 // check for NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
416 if (startsWith(str,"nan")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
417 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
418 if (str == "nan") {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
419 ceff = BIG_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
420 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
421 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
422 // set payload
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
423 str = str[3..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
424 // ensure string is all digits
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
425 foreach(char c; str) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
426 if (!isdigit(c)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
427 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
428 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
429 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
430 // convert string to payload
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
431 ceff = BigInt(str.idup);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
432 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
433 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
434
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
435 // check for sNaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
436 if (startsWith(str,"snan")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
437 spval = SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
438 if (str == "snan") {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
439 ceff = BIG_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
440 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
441 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
442 // set payload
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
443 str = str[4..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
444 // ensure string is all digits
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
445 foreach(char c; str) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
446 if (!isdigit(c)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
447 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
448 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
449 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
450 // convert string to payload
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
451 ceff = BigInt(str.idup);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
452 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
453 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
454
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
455 // check for infinity
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
456 if (str == "inf" || str == "infinity") {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
457 spval = SpVal.INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
458 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
459 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
460
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
461 clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
462 // check for exponent
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
463 int pos = find(str, 'e');
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
464 if (pos > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
465 // if it's just a trailing 'e', return NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
466 if (pos == str.length - 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
467 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
468 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
469 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
470 // split the string into coefficient and exponent
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
471 char[] xstr = str[pos+1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
472 str = str[0..pos];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
473 // assume exponent is positive
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
474 bool xneg = false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
475 // check for minus sign
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
476 if (startsWith(xstr, "-")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
477 xneg = true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
478 xstr = xstr[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
479 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
480 // check for plus sign
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
481 else if (startsWith(xstr, "+")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
482 xstr = xstr[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
483 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
484
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
485 // ensure it's not now empty
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
486 if (xstr.length < 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
487 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
488 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
489 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
490
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
491 // ensure exponent is all digits
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
492 foreach(char c; xstr) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
493 if (!isdigit(c)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
494 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
495 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
496 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
497 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
498
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
499 // trim leading zeros
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
500 while (xstr[0] == '0' && xstr.length > 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
501 xstr = xstr[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
502 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
503
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
504 // make sure it will fit into an int
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
505 if (xstr.length > 10) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
506 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
507 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
508 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
509 if (xstr.length == 10) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
510 // try to convert it to a long (should work) and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
511 // then see if the long value is too big (or small)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
512 long lex = to!long(xstr);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
513 if ((xneg && (-lex < int.min)) || lex > int.max) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
514 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
515 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
516 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
517 expo = cast(int) lex;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
518 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
519 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
520 // everything should be copacetic at this point
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
521 expo = to!int(xstr);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
522 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
523 if (xneg) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
524 expo = -expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
525 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
526 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
527 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
528 expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
529 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
530
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
531 // remove trailing decimal point
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
532 if (endsWith(str, ".")) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
533 str = str[0..$-1];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
534 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
535 // strip leading zeros
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
536 while (str[0] == '0' && str.length > 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
537 str = str[1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
538 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
539
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
540 // remove internal decimal point
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
541 int point = find(str, '.');
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
542 if (point >= 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
543 // excise the point and adjust exponent
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
544 str = str[0..point] ~ str[point+1..$];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
545 int diff = str.length - point;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
546 expo -= diff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
547 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
548
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
549 // ensure string is not empty
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
550 if (str.length < 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
551 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
552 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
553 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
554
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
555 // ensure string is all digits
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
556 foreach(char c; str) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
557 if (!isdigit(c)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
558 spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
559 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
560 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
561 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
562 // convert string to BigInt
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
563 ceff = BigInt(str.idup);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
564 digits = numDigits(ceff, str.length);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
565 if (ceff == BIG_ZERO) spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
566
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
567 }; // end opAssign(string)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
568
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
569 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
570 // string representations
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
571 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
572
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
573 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
574 * Converts a Decimal to an abstract string representation.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
575 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
576 private const string toAbstract() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
577 switch (spval) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
578 case SpVal.SNAN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
579 string payload = ceff == BIG_ZERO ? "" : "," ~ ceff.toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
580 return format("[%d,%s%s]", sign ? 1 : 0, "sNaN", payload);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
581 case SpVal.QNAN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
582 string payload = ceff == BIG_ZERO ? "" : "," ~ ceff.toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
583 return format("[%d,%s%s]", sign ? 1 : 0, "qNaN", payload);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
584 case SpVal.INF:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
585 return format("[%d,%s]", sign ? 1 : 0, "inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
586 default:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
587 return format("[%d,%s,%d]", sign ? 1 : 0, ceff.toString(), expo);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
588 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
589 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
590
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
591 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
592 * Converts a Decimal to a string representation.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
593 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
594 const string toString() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
595
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
596 // string representation of special values
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
597 if (spval > SpVal.ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
598 string str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
599 switch(spval) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
600 case SpVal.ZERO:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
601 str = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
602 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
603 case SpVal.INF:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
604 str = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
605 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
606 case SpVal.SNAN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
607 str = "sNaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
608 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
609 default:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
610 str = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
611 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
612 if (spval >= SpVal.QNAN && ceff != BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
613 str ~= ceff.toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
614 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
615 return sign ? "-" ~ str : str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
616 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
617
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
618 // string representation of finite numbers
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
619 string cstr = ceff.toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
620 int clen = cstr.length;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
621 int adjx = expo + clen - 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
622
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
623 // if exponent is small, don't use exponential notation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
624 if (expo <= 0 && adjx >= -6) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
625 // if exponent is not zero, insert a decimal point
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
626 if (expo != 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
627 int point = std.math.abs(expo);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
628 // if coefficient is too small, pad with zeroes
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
629 if (point > clen) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
630 cstr = zfill(cstr, point);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
631 clen = cstr.length;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
632 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
633 // if no chars precede the decimal point, prefix a zero
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
634 if (point == clen) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
635 cstr = "0." ~ cstr;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
636 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
637 // otherwise insert a decimal point
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
638 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
639 cstr = insert(cstr, cstr.length - point, ".");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
640 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
641 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
642 return sign ? "-" ~ cstr : cstr;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
643 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
644 // use exponential notation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
645 // else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
646 if (clen > 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
647 cstr = insert(cstr, 1, ".");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
648 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
649 string xstr = to!string(adjx);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
650 if (adjx >= 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
651 xstr = "+" ~ xstr;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
652 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
653 string str = cstr ~ "E" ~ xstr;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
654 if (sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
655 return "-" ~ str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
656 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
657 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
658 return str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
659 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
660 // } // end else
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
661
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
662 }; // end toString()
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
663
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
664 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
665 * Converts a Decimal to an engineering string representation.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
666 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
667 const string toEngString() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
668 return toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
669 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
670
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
671 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
672 * Converts a Decimal to a scientific string representation.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
673 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
674 const string toSciString() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
675 return toString();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
676 };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
677
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
678 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
679 write("to-sci-str...");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
680 Decimal dec = Decimal(false, 123, 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
681 assert(dec.toString() == "123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
682 assert(dec.toAbstract() == "[0,123,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
683 dec = Decimal(true, 123, 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
684 assert(dec.toString() == "-123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
685 assert(dec.toAbstract() == "[1,123,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
686 dec = Decimal(false, 123, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
687 assert(dec.toString() == "1.23E+3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
688 assert(dec.toAbstract() == "[0,123,1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
689 dec = Decimal(false, 123, 3);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
690 assert(dec.toString() == "1.23E+5");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
691 assert(dec.toAbstract() == "[0,123,3]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
692 dec = Decimal(false, 123, -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
693 assert(dec.toString() == "12.3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
694 assert(dec.toAbstract() == "[0,123,-1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
695 dec = Decimal(false, 123, -5);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
696 assert(dec.toString() == "0.00123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
697 assert(dec.toAbstract() == "[0,123,-5]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
698 dec = Decimal(false, 123, -10);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
699 assert(dec.toString() == "1.23E-8");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
700 assert(dec.toAbstract() == "[0,123,-10]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
701 dec = Decimal(true, 123, -12);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
702 assert(dec.toString() == "-1.23E-10");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
703 assert(dec.toAbstract() == "[1,123,-12]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
704 dec = Decimal(false, 0, 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
705 assert(dec.toString() == "0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
706 assert(dec.toAbstract() == "[0,0,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
707 dec = Decimal(false, 0, -2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
708 assert(dec.toString() == "0.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
709 assert(dec.toAbstract() == "[0,0,-2]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
710 dec = Decimal(false, 0, 2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
711 assert(dec.toString() == "0E+2");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
712 assert(dec.toAbstract() == "[0,0,2]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
713 dec = Decimal(true, 0, 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
714 assert(dec.toString() == "-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
715 assert(dec.toAbstract() == "[1,0,0]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
716 dec = Decimal(false, 5, -6);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
717 assert(dec.toString() == "0.000005");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
718 assert(dec.toAbstract() == "[0,5,-6]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
719 dec = Decimal(false, 50,-7);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
720 assert(dec.toString() == "0.0000050");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
721 assert(dec.toAbstract() == "[0,50,-7]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
722 dec = Decimal(false, 5, -7);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
723 assert(dec.toString() == "5E-7");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
724 assert(dec.toAbstract() == "[0,5,-7]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
725 dec = Decimal(false, "inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
726 assert(dec.toString() == "Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
727 assert(dec.toAbstract() == "[0,inf]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
728 dec = Decimal(true, "inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
729 assert(dec.toString() == "-Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
730 assert(dec.toAbstract() == "[1,inf]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
731 dec = Decimal(false, "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
732 assert(dec.toString() == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
733 assert(dec.toAbstract() == "[0,qNaN]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
734 dec = Decimal(false, "NaN", 123);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
735 assert(dec.toString() == "NaN123");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
736 assert(dec.toAbstract() == "[0,qNaN,123]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
737 dec = Decimal(true, "sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
738 assert(dec.toString() == "-sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
739 assert(dec.toAbstract() == "[1,sNaN]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
740 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
741 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
742
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
743
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
744 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
745 // member properties
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
746 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
747
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
748 /// returns the exponent of this Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
749 const int exponent() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
750 return this.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
751 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
752 /// returns the coefficient of this Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
753 const BigInt coefficient() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
754 return this.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
755 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
756
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
757 /// returns the sign of this Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
758 const int sgn() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
759 if (isZero) return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
760 return sign ? -1 : 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
761 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
762
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
763 /// returns a Decimal with the same exponent as this Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
764 /// and a coefficient of 1.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
765 const Decimal quantum() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
766 return Decimal(1, this.expo);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
767 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
768
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
769 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
770 // floating point properties
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
771 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
772
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
773 static int precision() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
774 return context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
775 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
776
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
777 /// returns the default value for this type (NaN)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
778 static Decimal init() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
779 return NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
780 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
781
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
782 /// Returns NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
783 static Decimal nan() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
784 return NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
785 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
786
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
787 /// Returns positive infinity.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
788 static Decimal infinity() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
789 return POS_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
790 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
791
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
792 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
793 // classification properties
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
794 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
795
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
796 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
797 * Returns true if this number is canonical representation (always true).
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
798 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
799 const bool isCanonical() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
800 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
801 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
802
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
803 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
804 * Returns true if this Decimal is +/- zero.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
805 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
806 const bool isZero() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
807 return spval == SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
808 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
809
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
810 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
811 * Returns true if this Decimal is a quiet or signaling NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
812 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
813 const bool isNaN() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
814 return this.spval == SpVal.QNAN || this.spval == SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
815 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
816
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
817 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
818 * Returns true if this Decimal is a signaling NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
819 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
820 const bool isSignaling() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
821 return this.spval == SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
822 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
823
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
824 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
825 * Returns true if this Decimal is a quiet NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
826 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
827 const bool isQuiet() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
828 return this.spval == SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
829 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
830
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
831 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
832 * Returns true if this Decimal is +/- infinity.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
833 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
834 const bool isInfinite() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
835 return this.spval == SpVal.INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
836 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
837
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
838 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
839 * Returns true if this Decimal is not +/- infinity and not a NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
840 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
841 const bool isFinite() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
842 return spval != SpVal.INF
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
843 && spval != SpVal.QNAN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
844 && spval != SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
845 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
846
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
847 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
848 * Returns true if this Decimal is a NaN or infinity.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
849 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
850 const bool isSpecial() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
851 return spval == SpVal.INF
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
852 || spval == SpVal.QNAN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
853 || spval == SpVal.SNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
854 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
855
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
856 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
857 * Returns true if this Decimal is negative. (Includes -0)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
858 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
859 const bool isSigned() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
860 return this.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
861 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
862
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
863 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
864 * Returns true if this Decimal is subnormal.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
865 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
866 const bool isSubnormal() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
867 if (spval != SpVal.CLEAR) return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
868 return adjustedExponent < context.eMin;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
869 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
870
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
871 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
872 * Returns true if this Decimal is subnormal.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
873 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
874 const bool isNormal() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
875 if (spval != SpVal.CLEAR) return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
876 return adjustedExponent >= context.eMin;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
877 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
878
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
879 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
880 // comparison
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
881 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
882
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
883 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
884 * Returns -1, 0 or 1, if this number is less than, equal to or
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
885 * greater than the argument, respectively.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
886 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
887 int opCmp(const Decimal that) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
888 return icompare(this, that);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
889 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
890
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
891 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
892 * Returns true if this Decimal is equal to the specified Decimal.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
893 * A NaN is not equal to any number, not even to another NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
894 * Infinities are equal if they have the same sign.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
895 * Zeros are equal regardless of sign.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
896 * Finite numbers are equal if they are numerically equal to the current precision.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
897 * A Decimal may not be equal to itself (this != this) if it is a NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
898 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
899 const bool opEquals(ref const Decimal that) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
900 // if either is NaN...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
901 if (this.isNaN || that.isNaN) return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
902
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
903 // if either is infinite...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
904 if (this.isInfinite || that.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
905 return (this.spval == that.spval && this.sign == that.sign);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
906 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
907
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
908 // if either is zero...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
909 if (this.isZero || that.isZero) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
910 return (this.isZero && that.isZero);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
911 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
912 // if their signs differ
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
913 if (this.sign != that.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
914 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
915 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
916
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
917 // if they have the same representation, they are equal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
918 if (this.expo == that.expo && this.ceff == that.ceff) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
919 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
920 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
921
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
922 // otherwise they are equal if they represent the same value
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
923 // NOTE: this is only a check to current precision.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
924 Decimal result = this - that;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
925 return result.isZero;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
926 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
927
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
928 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
929 write("equals.......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
930 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
931 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
932 op1 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
933 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
934 assert(op1 != op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
935 op1 = "inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
936 op2 = "inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
937 assert(op1 == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
938 op2 = "-inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
939 assert(op1 != op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
940 op1 = "-inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
941 assert(op1 == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
942 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
943 assert(op1 != op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
944 op1 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
945 assert(op1 != op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
946 op2 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
947 assert(op1 == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
948 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
949 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
950
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
951 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
952 // unary arithmetic operators
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
953 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
954
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
955 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
956 * unary minus -- returns a copy with the opposite sign.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
957 * This operation may set flags -- equivalent to
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
958 * subtract('0', b);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
959 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
960 const Decimal opNeg() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
961 return minus(this);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
962 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
963
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
964 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
965 * unary plus -- returns a copy.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
966 * This operation may set flags -- equivalent to
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
967 * add('0', a);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
968 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
969 const Decimal opPos() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
970 return plus(this);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
971 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
972
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
973 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
974 * Returns this + 1.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
975 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
976 Decimal opPostInc() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
977 this += ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
978 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
979 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
980
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
981 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
982 * Returns this - 1.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
983 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
984 Decimal opPostDec() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
985 this -= ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
986 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
987 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
988
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
989 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
990 // binary arithmetic operators
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
991 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
992
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
993 /// Adds a Decimal to this and returns the Decimal result
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
994 const Decimal opAdd(T:Decimal)(const T addend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
995 return add(this, addend);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
996 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
997
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
998 // Adds a number to this and returns the result.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
999 const Decimal opAdd(T)(const T addend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1000 return add(this, Decimal(addend), context);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1001 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1002
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1003 const Decimal opSub(T:Decimal)(const T subtrahend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1004 return subtract(this, subtrahend);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1005 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1006
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1007 const Decimal opSub(T)(const T subtrahend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1008 return subtract(this, Decimal(subtrahend), context);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1009 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1010
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1011 const Decimal opMul(T:Decimal)(const T factor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1012 return multiply(this, factor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1013 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1014
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1015 const Decimal opMul(T)(const T factor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1016 return multiply(this, Decimal(factor));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1017 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1018
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1019 const Decimal opDiv(T:Decimal)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1020 return divide(this, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1021 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1022
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1023 const Decimal opDiv(T)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1024 return divide(this, Decimal(divisor));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1025 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1026
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1027 const Decimal opMod(T:Decimal)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1028 return remainder(this, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1029 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1030
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1031 const Decimal opMod(T)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1032 return remainder(this, Decimal(divisor));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1033 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1034
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1035 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1036 // arithmetic assignment operators
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1037 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1038
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1039 Decimal opAddAssign(T)(const T addend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1040 this = this + addend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1041 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1042 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1043
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1044 Decimal opSubAssign(T)(const T subtrahend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1045 this = this - subtrahend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1046 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1047 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1048
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1049 Decimal opMulAssign(T)(const T factor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1050 this = this * factor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1051 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1052 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1053
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1054 Decimal opDivAssign(T)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1055 this = this / divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1056 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1057 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1058
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1059 Decimal opModAssign(T)(const T divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1060 this = this % divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1061 return this;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1062 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1063
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1064 //-----------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1065 // nextUp, nextDown, nextAfter
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1066 //-----------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1067
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1068 const Decimal nextUp() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1069 return nextPlus(this);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1070 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1071
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1072 const Decimal nextDown() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1073 return nextMinus(this);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1074 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1075
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1076 const Decimal nextAfter(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1077 return nextToward(this, dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1078 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1079
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1080 private:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1081 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1082 * clears the special value flags
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1083 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1084 void clear() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1085 spval = SpVal.CLEAR;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1086 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1087
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1088 const int adjustedExponent() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1089 return expo + digits - 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1090 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1091
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1092 const bool overflow() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1093 return adjustedExponent > context.eMax;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1094 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1095
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1096 unittest{
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1097 write("overflow.....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1098 Decimal dec = Decimal(123, 99);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1099 assert(dec.overflow);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1100 dec = Decimal(12, 99);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1101 assert(dec.overflow);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1102 dec = Decimal(1, 99);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1103 assert(!dec.overflow);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1104 dec = Decimal(9, 99);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1105 assert(!dec.overflow);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1106 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1107 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1108
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1109 } // end struct Decimal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1110
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1111
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1112 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1113 // context functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1114 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1115
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1116 // TODO: this is actually a property of the context.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1117
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1118 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1119 * Returns radix of this representation (10).
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1120 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1121 public int radix() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1122 return 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1123 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1124
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1125 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1126 write("radix........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1127 assert(radix() == 10);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1128 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1129 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1130
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1131 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1132 // classification functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1133 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1134
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1135 public string classify(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1136 if (dcm.isSignaling()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1137 return "sNaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1138 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1139 if (dcm.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1140 return "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1141 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1142 if (dcm.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1143 return dcm.sign ? "-Infinity" : "+Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1144 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1145 if (dcm.isSubnormal) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1146 return dcm.sign ? "-Subnormal" : "+Subnormal";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1147 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1148 if (dcm.isZero) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1149 return dcm.sign ? "-Zero" : "+Zero";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1150 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1151 return dcm.sign ? "-Normal" : "+Normal";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1152 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1153
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1154 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1155 * Returns true if this number is canonical representation (always true).
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1156 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1157 public bool isCanonical(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1158 return dcm.isCanonical;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1159 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1160
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1161 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1162 * Returns true if this Decimal is a signaling NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1163 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1164 public bool isSignaling(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1165 return dcm.isSignaling;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1166 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1167
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1168 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1169 * Returns true if the specified Decimal is a quiet NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1170 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1171 public bool isQuiet(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1172 return dcm.isQuiet;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1173 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1174
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1175 public bool isFinite(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1176 return dcm.isFinite;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1177 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1178
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1179 public bool isInfinite(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1180 return dcm.isInfinite;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1181 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1182
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1183 public bool isNaN(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1184 return dcm.isNaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1185 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1186
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1187 public bool isNormal(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1188 return dcm.isNormal;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1189 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1190
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1191 public bool isSubnormal(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1192 return dcm.isSubnormal;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1193 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1194
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1195 public bool isZero(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1196 return dcm.isZero;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1197 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1198
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1199 public bool isSigned(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1200 return dcm.isSigned;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1201 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1202
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1203 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1204 write("classify.....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1205 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1206 dcm = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1207 assert(classify(dcm) == "+Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1208 dcm = "1E-10";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1209 assert(classify(dcm) == "+Normal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1210 dcm = "2.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1211 assert(classify(dcm) == "+Normal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1212 dcm = "0.1E-99";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1213 assert(classify(dcm) == "+Subnormal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1214 dcm = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1215 assert(classify(dcm) == "+Zero");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1216 dcm = "-0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1217 assert(classify(dcm) == "-Zero");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1218 dcm = "-0.1E-99";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1219 assert(classify(dcm) == "-Subnormal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1220 dcm = "-1E-10";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1221 assert(classify(dcm) == "-Normal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1222 dcm = "-2.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1223 assert(classify(dcm) == "-Normal");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1224 dcm = "-Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1225 assert(classify(dcm) == "-Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1226 dcm = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1227 assert(classify(dcm) == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1228 dcm = "-NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1229 assert(classify(dcm) == "NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1230 dcm = "sNaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1231 assert(classify(dcm) == "sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1232
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1233 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1234 assert(isCanonical(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1235
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1236 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1237 assert(isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1238 dcm = Decimal("-0.3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1239 assert(isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1240 dcm = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1241 assert(isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1242 dcm = Decimal("Inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1243 assert(!isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1244 dcm = Decimal("-Inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1245 assert(!isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1246 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1247 assert(!isFinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1248
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1249 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1250 assert(!isInfinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1251 dcm = Decimal("-Inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1252 assert(isInfinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1253 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1254 assert(!isInfinite(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1255
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1256 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1257 assert(!isNaN(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1258 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1259 assert(isNaN(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1260 dcm = Decimal("-sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1261 assert(isNaN(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1262
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1263 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1264 assert(isNormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1265 dcm = Decimal("0.1E-99");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1266 assert(!isNormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1267 dcm = Decimal("0.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1268 assert(!isNormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1269 dcm = Decimal("-Inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1270 assert(!isNormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1271 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1272 assert(!isNormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1273 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1274
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1275 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1276 assert(!isQuiet(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1277 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1278 assert(isQuiet(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1279 dcm = Decimal("sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1280 assert(!isQuiet(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1281
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1282 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1283 assert(!isSignaling(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1284 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1285 assert(!isSignaling(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1286 dcm = Decimal("sNaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1287 assert(isSignaling(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1288
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1289 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1290 assert(!isSigned(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1291 dcm = Decimal("-12");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1292 assert(isSigned(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1293 dcm = Decimal("-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1294 assert(isSigned(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1295
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1296 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1297 assert(!isSubnormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1298 dcm = Decimal("0.1E-99");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1299 assert(isSubnormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1300 dcm = Decimal("0.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1301 assert(!isSubnormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1302 dcm = Decimal("-Inf");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1303 assert(!isSubnormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1304 dcm = Decimal("NaN");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1305 assert(!isSubnormal(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1306
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1307 dcm = Decimal("0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1308 assert(isZero(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1309 dcm = Decimal("2.50");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1310 assert(!isZero(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1311 dcm = Decimal("-0E+2");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1312 assert(isZero(dcm));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1313
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1314 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1315
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1316 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1317 // copy functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1318 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1319
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1320 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1321 * Returns a copy of the operand.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1322 * The copy is unaffected by context; no flags are changed.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1323 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1324 Decimal copy(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1325 Decimal cpy = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1326 return cpy;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1327 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1328
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1329 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1330 * Returns a copy of the operand with a positive sign.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1331 * The copy is unaffected by context; no flags are changed.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1332 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1333 Decimal copyAbs(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1334 Decimal cpy = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1335 cpy.sign = false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1336 return cpy;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1337 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1338
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1339 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1340 * Returns a copy of the operand with the sign inverted.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1341 * The copy is unaffected by context; no flags are changed.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1342 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1343 Decimal copyNegate(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1344 Decimal cpy = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1345 cpy.sign = !dcm.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1346 return cpy;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1347 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1348
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1349 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1350 * Returns a copy of the first operand with the sign of the second operand.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1351 * The copy is unaffected by context; no flags are changed.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1352 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1353 Decimal copySign(const Decimal dcm1, const Decimal dcm2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1354 Decimal cpy = dcm1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1355 cpy.sign = dcm2.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1356 return cpy;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1357 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1358
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1359 // TODO: these should actually be compare-total assertions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1360 // This is probably true of other unit tests as well
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1361 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1362 write("copy.........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1363 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1364 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1365 dcm = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1366 expd = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1367 assert(copy(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1368 dcm = "-1.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1369 expd = "-1.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1370 assert(copy(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1371 dcm = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1372 expd = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1373
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1374 assert(copyAbs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1375 dcm = "-1.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1376 expd = "1.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1377 assert(copyAbs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1378 dcm = "101.5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1379 expd = "-101.5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1380
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1381 assert(copyNegate(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1382 Decimal dcm1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1383 Decimal dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1384 dcm1 = "1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1385 dcm2 = "7.33";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1386 expd = "1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1387
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1388 assert(copySign(dcm1, dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1389 dcm1 = "-1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1390 dcm2 = "7.33";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1391 expd = "1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1392 assert(copySign(dcm1, dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1393 dcm1 = "1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1394 dcm2 = "-7.33";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1395 expd = "-1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1396 assert(copySign(dcm1, dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1397 dcm1 = "-1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1398 dcm2 = "-7.33";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1399 expd = "-1.50";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1400 assert(copySign(dcm1, dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1401 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1402 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1403
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1404 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1405 // plus, minus and abs functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1406 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1407
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1408 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1409 * unary minus -- returns a copy with the opposite sign.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1410 * This operation may set flags -- equivalent to
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1411 * subtract('0', b);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1412 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1413 Decimal minus(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1414 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1415 if(isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1416 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1417 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1418 result = copyNegate(dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1419 round(result);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1420 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1421 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1422
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1423 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1424 * unary plus -- returns a copy.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1425 * This operation may set flags -- equivalent to
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1426 * add('0', a);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1427 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1428 Decimal plus(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1429 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1430 if(isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1431 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1432 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1433 result = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1434 round(result);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1435 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1436 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1437
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1438 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1439 write("minus/plus...");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1440 // NOTE: result should equal 0+this or 0-this
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1441 Decimal zero = Decimal(0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1442 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1443 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1444 dcm = "1.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1445 expd = zero + dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1446 assert(+dcm == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1447 dcm = "-1.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1448 expd = zero + dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1449 assert(+dcm == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1450 dcm = "1.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1451 expd = zero - dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1452 assert(-dcm == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1453 dcm = "-1.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1454 expd = zero - dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1455 assert(-dcm == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1456 // TODO: add tests that check flags.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1457 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1458 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1459
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1460 /// Returns a new Decimal equal to the absolute value of this Decimal.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1461 public Decimal abs(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1462 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1463 if(isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1464 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1465 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1466 result = copyAbs(dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1467 round(result);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1468 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1469 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1470
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1471 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1472 // TODO: add rounding tests
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1473 write("abs..........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1474 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1475 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1476 dcm = "sNaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1477 assert(abs(dcm).isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1478 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1479 dcm = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1480 assert(abs(dcm).isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1481 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1482 dcm = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1483 expd = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1484 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1485 dcm = "-Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1486 expd = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1487 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1488 dcm = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1489 expd = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1490 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1491 dcm = "-0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1492 expd = "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1493 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1494 dcm = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1495 expd = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1496 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1497 dcm = -100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1498 expd = 100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1499 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1500 dcm = 101.5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1501 expd = 101.5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1502 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1503 dcm = -101.5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1504 assert(abs(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1505 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1506 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1507
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1508 public Decimal nextPlus(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1509 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1510 if (isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1511 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1512 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1513 if (dcm.isInfinite && dcm.sign) return -context.max();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1514 int adjx = dcm.expo + dcm.digits - context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1515 if (adjx < context.eTiny) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1516 return Decimal(true, 0, context.eTiny);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1517 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1518 Decimal addend = Decimal(1, adjx);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1519 result = dcm + addend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1520 if (result > context.max) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1521 result = POS_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1522 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1523 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1524 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1525
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1526 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1527 write("next-plus....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1528 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1529 context.eMax = 999;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1530 context.eMin = -999;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1531 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1532 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1533 dcm = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1534 expd = "1.00000001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1535 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1536 dcm = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1537 expd = "10.0000001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1538 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1539 dcm = 1E5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1540 expd = "100000.001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1541 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1542 dcm = 1E8;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1543 expd = "100000001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1544 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1545 // num digits exceeds precision...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1546 dcm = "1234567891";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1547 expd = "1.23456790E9";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1548 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1549 // result < tiny
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1550 dcm = "-1E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1551 expd = "-0E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1552 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1553 dcm = "-1.00000003";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1554 expd = "-1.00000002";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1555 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1556 dcm = "-Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1557 expd = "-9.99999999E+999";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1558 assert(nextPlus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1559 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1560 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1561 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1562
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1563 public Decimal nextMinus(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1564 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1565 if (isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1566 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1567 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1568 if (dcm.isInfinite && !dcm.sign) return context.max();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1569 // This is necessary to catch the special case where ceff == 1
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1570 Decimal red = reduce(dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1571 int adjx = red.expo + red.digits - context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1572 if (dcm.ceff == 1) adjx--;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1573 if (adjx < context.eTiny) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1574 return Decimal(false, 0, context.eTiny);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1575 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1576 Decimal addend = Decimal(1, adjx);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1577 result = dcm - addend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1578 if (result < -context.max) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1579 result = NEG_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1580 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1581 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1582 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1583
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1584 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1585 write("next-minus...");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1586 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1587 context.eMax = 999;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1588 context.eMin = -999;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1589 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1590 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1591 dcm = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1592 expd = "0.999999999";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1593 assert(nextMinus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1594 dcm = "1E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1595 expd = "0E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1596 assert(nextMinus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1597 dcm = "-1.00000003";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1598 expd = "-1.00000004";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1599 assert(nextMinus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1600 dcm = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1601 expd = "9.99999999E+999";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1602 assert(nextMinus(dcm) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1603 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1604 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1605 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1606
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1607 public Decimal nextToward(const Decimal dcm1, const Decimal dcm2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1608 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1609 if (isInvalidOperation(dcm1, dcm2, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1610 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1611 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1612 int comp = icompare(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1613 if (comp < 0) return nextPlus(dcm1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1614 if (comp > 0) return nextMinus(dcm1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1615 result = copySign(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1616 round(result);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1617 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1618 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1619
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1620 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1621 write("next-toward..");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1622 DecimalContext save = context;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1623 Decimal dcm1, dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1624 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1625 dcm1 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1626 dcm2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1627 expd = "1.00000001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1628 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1629 dcm1 = "-1E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1630 dcm2 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1631 expd = "-0E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1632 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1633 dcm1 = "-1.00000003";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1634 dcm2 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1635 expd = "-1.00000002";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1636 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1637 dcm1 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1638 dcm2 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1639 expd = "0.999999999";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1640 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1641 dcm1 = "1E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1642 dcm2 = -100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1643 expd = "0E-1007";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1644 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1645 dcm1 = "-1.00000003";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1646 dcm2 = -10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1647 expd = "-1.00000004";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1648 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1649 dcm1 = "0.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1650 dcm2 = "-0.0000";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1651 expd = "-0.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1652 assert(nextToward(dcm1,dcm2) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1653 context = save;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1654 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1655 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1656
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1657 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1658 // comparison functions
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1659 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1660
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1661 /// returns true if the numbers have the same exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1662 public bool sameQuantum(const Decimal x, const Decimal y) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1663 if (x.isNaN || y.isNaN) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1664 return x.isNaN && y.isNaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1665 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1666 if (x.isInfinite || y.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1667 return x.isInfinite && y.isInfinite;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1668 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1669 return x.expo == y.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1670 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1671
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1672 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1673 write("same-quantum.");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1674 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1675 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1676 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1677 op2 = "0.001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1678 assert(!sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1679 op2 = "0.01";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1680 assert(sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1681 op2 = "0.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1682 assert(!sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1683 op2 = "1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1684 assert(!sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1685 op1 = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1686 op2 = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1687 assert(sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1688 op1 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1689 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1690 assert(sameQuantum(op1, op2));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1691 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1692 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1693
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1694 public Decimal compare(const Decimal dcm1, const Decimal dcm2,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1695 const bool signal = false) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1696 // sNaN is an invalid operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1697 if (dcm1.isSignaling && dcm2.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1698 return invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1699 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1700 // qNaN is invalid if signal flag is set.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1701 if (signal && (dcm1.isNaN || dcm2.isNaN)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1702 return invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1703 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1704 // NaN returns > any number, including NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1705 if (dcm1.isNaN) return ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1706 if (dcm2.isNaN) return -ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1707
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1708 if (dcm1.sign != dcm2.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1709 Decimal op1 = dcm1.sign ? -ONE : ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1710 Decimal op2 = -op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1711 op1 = dcm1.isZero ? ZERO : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1712 op2 = dcm2.isZero ? ZERO : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1713 return op1 != op2 ? op1 : ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1714 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1715 int diff = (dcm1.expo + dcm1.digits) - (dcm2.expo + dcm2.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1716 if (!dcm1.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1717 if (diff > 0) return ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1718 if (diff < 0) return -ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1719 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1720 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1721 if (diff > 0) return -ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1722 if (diff < 0) return ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1723 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1724 Decimal result = dcm1 - dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1725 if (result.isZero) return ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1726 return result.sign ? -ONE : ONE;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1727 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1728
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1729 public int icompare(const Decimal dcm1, const Decimal dcm2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1730 // sNaN is invalid operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1731 // NaN returns > any number, including NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1732 if (dcm1.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1733 invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1734 return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1735 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1736 if (dcm2.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1737 invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1738 return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1739 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1740 // NaN returns > any number, including NaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1741 if (dcm1.isNaN) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1742 if (dcm2.isNaN) return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1743
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1744 if (dcm1.sign != dcm2.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1745 int op1 = dcm1.sign ? -1 : 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1746 int op2 = -op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1747 op1 = dcm1.isZero ? 0 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1748 op2 = dcm2.isZero ? 0 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1749 return op1 != op2 ? op1 : 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1750 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1751 int diff = (dcm1.expo + dcm1.digits) - (dcm2.expo + dcm2.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1752 if (!dcm1.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1753 if (diff > 0) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1754 if (diff < 0) return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1755 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1756 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1757 if (diff > 0) return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1758 if (diff < 0) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1759 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1760 Decimal result = dcm1 - dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1761 if (result.isZero) return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1762 return result.sign ? -1 : 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1763 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1764
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1765 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1766 write("compare......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1767 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1768 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1769 int result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1770 op1 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1771 op2 = "3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1772 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1773 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1774 op1 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1775 op2 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1776 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1777 assert(result == 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1778 op1 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1779 op2 = "2.10";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1780 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1781 assert(result == 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1782 op1 = "3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1783 op2 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1784 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1785 assert(result == 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1786 op1 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1787 op2 = "-3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1788 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1789 assert(result == 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1790 op1 = "-3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1791 op2 = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1792 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1793 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1794 op1 = -3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1795 op2 = -4;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1796 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1797 assert(result == 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1798 op1 = -300;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1799 op2 = -4;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1800 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1801 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1802 op1 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1803 op2 = context.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1804 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1805 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1806 op1 = -3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1807 op2 = -context.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1808 result = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1809 assert(result == 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1810
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1811 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1812 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1813
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1814 /// Returns 0 if the numbers are equal and have the same representation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1815 public int compareTotal(const Decimal x, const Decimal y) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1816 if (x.sign != y.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1817 return x.sign ? -1 : 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1818 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1819 if (x.isQuiet || y.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1820 if (x.isQuiet && y.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1821 return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1822 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1823 return x.isQuiet ? 1 : -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1824 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1825 if (x.isSignaling || y.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1826 return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1827 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1828 if (x.isInfinite || y.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1829 return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1830 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1831 int diff = (x.expo + x.digits) - (y.expo + y.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1832 if (diff > 0) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1833 if (diff < 0) return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1834 Decimal result = x - y;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1835 if (result.isZero) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1836 if (x.expo > y.expo) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1837 if (x.expo < y.expo) return -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1838 return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1839 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1840 return result.sign ? -1 : 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1841 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1842
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1843 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1844 write("comp-total...");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1845 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1846 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1847 int result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1848 op1 = "12.73";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1849 op2 = "127.9";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1850 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1851 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1852 op1 = "-127";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1853 op2 = "12";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1854 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1855 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1856 op1 = "12.30";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1857 op2 = "12.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1858 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1859 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1860 op1 = "12.30";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1861 op2 = "12.30";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1862 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1863 assert(result == 0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1864 op1 = "12.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1865 op2 = "12.300";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1866 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1867 assert(result == 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1868 op1 = "12.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1869 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1870 result = compareTotal(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1871 assert(result == -1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1872 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1873 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1874
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1875 int compareTotalMagnitude(const Decimal x, const Decimal y) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1876 return compareTotal(copyAbs(x), copyAbs(y));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1877 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1878
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1879 // TODO: this is where the need for flags comes in.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1880 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1881 * Returns the maximum of the two operands (or NaN).
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1882 * If either is an sNaN, or both are quiet NaNs, a NaN is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1883 * Otherwise, Any (finite or infinite) number is larger than a NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1884 * If they are not numerically equal, the larger is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1885 * If they are numerically equal:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1886 * 1) If the signs differ, the one with the positive sign is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1887 * 2) If they are positive, the one with the larger exponent is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1888 * 3) If they are negative, the one with the smaller exponent is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1889 * 4) Otherwise, they are indistinguishable; the first is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1890 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1891 Decimal max(const Decimal op1, const Decimal op2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1892 // if both are NaNs or either is an sNan, return NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1893 if (op1.isNaN && op2.isNaN || op1.isSignaling || op2.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1894 return NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1895 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1896 // if one op is a quiet NaN return the other
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1897 if (op1.isQuiet || op2.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1898 return (op1.isQuiet) ? op2 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1899 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1900 // if the signs differ, return the unsigned operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1901 if (op1.sign != op2.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1902 return op1.sign ? op2 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1903 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1904 // if not numerically equal, return the larger
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1905 int comp = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1906 if (comp != 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1907 return comp > 0 ? op1 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1908 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1909 // if they have the same exponent they are identical, return either
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1910 if (op1.expo == op2.expo) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1911 return op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1912 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1913 // if they are non-negative, return the one with larger exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1914 if (op1.sign == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1915 return op1.expo > op2.expo ? op1 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1916 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1917 // else they are negative; return the one with smaller exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1918 return op1.expo > op2.expo ? op2 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1919 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1920
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1921 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1922 write("max..........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1923 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1924 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1925 op1 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1926 op2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1927 assert(max(op1, op2) == op1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1928 op1 = -10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1929 op2 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1930 assert(max(op1, op2) == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1931 op1 = "1.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1932 op2 = "1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1933 assert(max(op1, op2) == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1934 op1 = "7";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1935 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1936 assert(max(op1, op2) == op1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1937 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1938 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1939
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1940 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1941 * Returns the minimum of the two operands (or NaN).
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1942 * If either is an sNaN, or both are quiet NaNs, a NaN is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1943 * Otherwise, Any (finite or infinite) number is smaller than a NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1944 * If they are not numerically equal, the smaller is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1945 * If they are numerically equal:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1946 * 1) If the signs differ, the one with the negative sign is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1947 * 2) If they are negative, the one with the larger exponent is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1948 * 3) If they are positive, the one with the smaller exponent is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1949 * 4) Otherwise, they are indistinguishable; the first is returned.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1950 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1951 Decimal min(const Decimal op1, const Decimal op2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1952 // if both are NaNs or either is an sNan, return NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1953 if (op1.isNaN && op2.isNaN || op1.isSignaling || op2.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1954 /+ Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1955 result.flags = INVALID_OPERATION;+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1956 return NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1957 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1958 // if one op is a quiet NaN return the other
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1959 if (op1.isQuiet || op2.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1960 return (op1.isQuiet) ? op2 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1961 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1962 // if the signs differ, return the unsigned operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1963 if (op1.sign != op2.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1964 return op1.sign ? op1 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1965 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1966 // if not numerically equal, return the smaller
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1967 int comp = icompare(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1968 if (comp != 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1969 return comp < 0 ? op1 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1970 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1971 // if they have the same exponent they are identical, return either
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1972 if (op1.expo == op2.expo) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1973 return op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1974 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1975 // if they are non-negative, return the one with smaller exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1976 if (op1.sign == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1977 return op1.expo < op2.expo ? op1 : op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1978 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1979 // else they are negative; return the one with larger exponent.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1980 return op1.expo < op2.expo ? op2 : op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1981 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1982
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1983 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1984 write("min..........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1985 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1986 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1987 op1 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1988 op2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1989 assert(min(op1, op2) == op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1990 op1 = -10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1991 op2 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1992 assert(min(op1, op2) == op1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1993 op1 = "1.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1994 op2 = "1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1995 assert(min(op1, op2) == op1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1996 op1 = "7";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1997 op2 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1998 assert(min(op1, op2) == op1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1999 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2000 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2001
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2002 //------------------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2003 //
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2004 // Binary Arithmetic Operations
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2005 //
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2006 //------------------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2007
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2008 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2009 * Adds two Decimal numbers.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2010 *
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2011 * This function corresponds to the "add and subtract" function
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2012 * in the General Decimal Arithmetic Specification and is the basis
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2013 * for the opAdd and opSub functions for the Decimal struct.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2014 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2015 Decimal add(const Decimal augend, const Decimal addend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2016
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2017 Decimal sum;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2018 // check for NaN operand(s)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2019 if (isInvalidOperation(augend, addend, sum)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2020 return sum;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2021 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2022 // if both operands are infinite
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2023 if (augend.isInfinite && addend.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2024 // (+inf) + (-inf) => invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2025 if (augend.sign != addend.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2026 return invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2027 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2028 // both infinite with same sign
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2029 return augend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2030 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2031
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2032 /+ if (isInvalidAddition(augend, addend, sum)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2033 return sum;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2034 }+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2035 // TODO: is it okay to return the operand? is a copy implied?
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2036 // only augend is infinite,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2037 if (augend.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2038 return augend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2039 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2040 // only addend is infinite
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2041 if (addend.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2042 return addend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2043 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2044
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2045 // align the operands
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2046 alignOps(augend, addend);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2047
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2048 // add(0, 0)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2049 if (augend.isZero && addend.isZero) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2050 sum = augend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2051 sum.sign = augend.sign && addend.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2052 return sum;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2053 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2054
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2055 // at this point, the result will be finite and not zero
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2056 // (before rounding)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2057 sum.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2058
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2059 // if operands have the same sign...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2060 if (augend.sign == addend.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2061 sum.ceff = augend.ceff + addend.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2062 sum.sign = augend.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2063 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2064 // ...else operands have different signs
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2065 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2066 sum.ceff = augend.ceff - addend.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2067 sum.sign = augend.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2068 if (sum.ceff < BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2069 sum.ceff = -sum.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2070 sum.sign = !sum.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2071 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2072 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2073 // set the number of digits and the exponent
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2074 sum.digits = numDigits(sum.ceff, augend.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2075 sum.expo = augend.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2076
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2077 // round the result
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2078 round(sum);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2079 return sum;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2080 } // end add(augend, addend)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2081
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2082 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2083 * Subtracts two Decimal numbers.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2084 *
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2085 * This function corresponds to the "add and subtract" function
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2086 * in the General Decimal Arithmetic Specification and is the basis
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2087 * for the opAdd and opSub functions for the Decimal struct.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2088 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2089 Decimal subtract(const Decimal minuend, const Decimal subtrahend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2090 return add(minuend, copyNegate(subtrahend));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2091 } // end subtract(minuend, subtrahend)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2092
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2093 // TODO: these tests need to be cleaned up to rely less on strings
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2094 // and to check the NaN, Inf combinations better.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2095 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2096 write("add..........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2097 Decimal dcm1 = Decimal("12");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2098 Decimal dcm2 = Decimal("7.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2099 Decimal sum = add(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2100 assert(sum.toString() == "19.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2101 dcm1 = Decimal("1E+2");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2102 dcm2 = Decimal("1E+4");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2103 sum = add(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2104 assert(sum.toString() == "1.01E+4");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2105 dcm1 = Decimal("1.3");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2106 dcm2 = Decimal("1.07");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2107 sum = subtract(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2108 assert(sum.toString() == "0.23");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2109 dcm2 = Decimal("1.30");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2110 sum = subtract(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2111 assert(sum.toString() == "0.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2112 dcm2 = Decimal("2.07");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2113 sum = subtract(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2114 assert(sum.toString() == "-0.77");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2115 dcm1 = "Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2116 dcm2 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2117 sum = add(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2118 assert(sum.toString() == "Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2119 dcm1 = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2120 dcm2 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2121 sum = add(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2122 assert(sum.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2123 dcm2 = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2124 sum = add(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2125 assert(sum.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2126 dcm1 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2127 sum = subtract(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2128 assert(sum.toString() == "-Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2129 dcm1 = "-0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2130 dcm2 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2131 sum = subtract(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2132 assert(sum.toString() == "-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2133 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2134 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2135
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2136 Decimal multiply(const Decimal multiplier, const Decimal multiplicand) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2137
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2138 Decimal product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2139 if (isInvalidMultiplication(multiplier, multiplicand, product)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2140 return product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2141 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2142 if (multiplier.isInfinite || multiplicand.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2143 product = Decimal.infinity;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2144 product.sign = multiplier.sign ^ multiplicand.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2145 return product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2146 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2147 product.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2148 product.ceff = multiplier.ceff * multiplicand.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2149 product.expo = multiplier.expo + multiplicand.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2150 product.sign = multiplier.sign ^ multiplicand.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2151 product.digits = numDigits(product.ceff, multiplier.digits + multiplicand.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2152 round(product);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2153 return product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2154 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2155
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2156 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2157 write("multiply.....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2158 Decimal op1, op2, result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2159 op1 = Decimal("1.20");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2160 op2 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2161 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2162 assert(result.toString() == "3.60");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2163 op1 = 7;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2164 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2165 assert(result.toString() == "21");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2166 op1 = Decimal("0.9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2167 op2 = Decimal("0.8");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2168 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2169 assert(result.toString() == "0.72");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2170 op1 = Decimal("0.9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2171 op2 = Decimal("-0.0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2172 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2173 assert(result.toString() == "-0.00");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2174 op1 = Decimal(654321);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2175 op2 = Decimal(654321);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2176 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2177 assert(result.toString() == "4.28135971E+11");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2178 op1 = -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2179 op2 = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2180 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2181 assert(result.toString() == "-Infinity");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2182 op1 = -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2183 op2 = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2184 result = op1 * op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2185 assert(result.toString() == "-0");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2186 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2187 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2188
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2189 Decimal fma(const Decimal multiplier, const Decimal multiplicand,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2190 const Decimal addend) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2191 Decimal product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2192 if (isInvalidMultiplication(multiplier, multiplicand, product)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2193 return product;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2194 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2195 product.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2196 product.ceff = multiplier.ceff * multiplicand.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2197 product.expo = multiplier.expo + multiplicand.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2198 product.sign = multiplier.sign ^ multiplicand.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2199 product.digits = numDigits(product.ceff, multiplier.digits + multiplicand.digits);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2200 return add(product, addend);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2201 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2202
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2203 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2204 write("fma..........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2205 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2206 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2207 Decimal op3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2208 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2209 op1 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2210 op2 = 5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2211 op3 = 7;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2212 result = (fma(op1, op2, op3));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2213 assert(result == Decimal(22));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2214 op1 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2215 op2 = -5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2216 op3 = 7;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2217 result = (fma(op1, op2, op3));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2218 assert(result == Decimal(-8));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2219 op1 = "888565290";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2220 op2 = "1557.96930";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2221 op3 = "-86087.7578";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2222 result = (fma(op1, op2, op3));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2223 assert(result == Decimal("1.38435736E+12"));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2224 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2225 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2226
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2227 bool isZeroDividend(const Decimal dividend, const Decimal divisor,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2228 Decimal quotient) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2229 if (dividend.isZero()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2230 quotient.spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2231 quotient.ceff = BIG_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2232 quotient.expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2233 quotient.digits = dividend.digits;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2234 quotient.sign = dividend.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2235 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2236 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2237 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2238 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2239
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2240 Decimal divide(const Decimal dividend, const Decimal divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2241
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2242 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2243 if (isInvalidDivision(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2244 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2245 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2246 if (isZeroDividend(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2247 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2248 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2249 quotient.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2250
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2251 Decimal temp = dividend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2252 int adjust = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2253 while (temp.ceff < divisor.ceff) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2254 temp.ceff *= 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2255 adjust++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2256 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2257 bool complete = false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2258 while (!complete) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2259 // repeated subtraction
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2260 while (divisor.ceff <= temp.ceff) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2261 temp.ceff -= divisor.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2262 quotient.ceff++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2263 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2264 // check for done
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2265 if (temp.ceff == 0 && adjust >= 0
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2266 || numDigits(quotient.ceff, 1) == context.precision + 2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2267 complete = true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2268 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2269 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2270 // bump the quotient and temp by 10
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2271 quotient.ceff *= 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2272 temp.ceff *= 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2273 adjust++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2274 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2275 quotient.digits = numDigits(quotient.ceff, context.precision);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2276 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2277 quotient.expo = temp.expo - divisor.expo - adjust;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2278 quotient.sign = temp.sign ^ divisor.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2279 round(quotient);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2280 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2281 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2282
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2283 Decimal edivide(const Decimal dividend, const Decimal divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2284 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2285 if (isInvalidDivision(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2286 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2287 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2288 if (isZeroDividend(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2289 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2290 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2291 quotient.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2292 Decimal denom = dividend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2293 Decimal numer = divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2294 // align operands
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2295 int diff = denom.expo - numer.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2296 if (diff < 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2297 numer.ceff *= pow10(-diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2298 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2299 if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2300 numer.ceff *= pow10(diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2301 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2302 numer.digits = numDigits(numer.ceff, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2303 denom.digits = numDigits(denom.ceff, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2304 int shift = 2 + context.precision - denom.digits + numer.digits;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2305 if (shift > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2306 denom.ceff *= pow10(shift);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2307 denom.expo -= shift;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2308 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2309 quotient.ceff = denom.ceff / numer.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2310 quotient.expo = denom.expo - numer.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2311 quotient.sign = denom.sign ^ numer.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2312 quotient.digits = numDigits(quotient.ceff, context.precision);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2313 round(quotient);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2314 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2315 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2316
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2317 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2318 write("divide.......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2319 Decimal dcm1, dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2320 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2321 dcm1 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2322 dcm2 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2323 Decimal quotient = edivide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2324 expd = "0.333333333";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2325 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2326 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2327 dcm1 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2328 dcm2 = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2329 quotient = edivide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2330 expd = "0.666666667";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2331 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2332 dcm1 = 5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2333 dcm2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2334 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2335 expd = "2.5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2336 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2337 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2338 dcm1 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2339 dcm2 = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2340 expd = 0.1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2341 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2342 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2343 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2344 dcm1 = "8.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2345 dcm2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2346 expd = "4.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2347 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2348 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2349 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2350 dcm1 = "2.400";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2351 dcm2 = "2.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2352 expd = "1.20";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2353 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2354 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2355 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2356 dcm1 = 1000;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2357 dcm2 = 100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2358 expd = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2359 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2360 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2361 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2362 dcm2 = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2363 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2364 expd = 1000;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2365 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2366 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2367 dcm1 = "2.40E+6";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2368 dcm2 = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2369 expd = "1.20E+6";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2370 quotient = divide(dcm1, dcm2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2371 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2372 assert(quotient.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2373 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2374 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2375
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2376 Decimal divideInteger(const Decimal dividend, const Decimal divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2377 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2378 if (isInvalidDivision(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2379 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2380 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2381 if (isZeroDividend(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2382 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2383 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2384 quotient.clear();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2385 Decimal denom = dividend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2386 Decimal numer = divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2387 // align operands
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2388 int diff = denom.expo - numer.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2389 if (diff < 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2390 numer.ceff *= pow10(-diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2391 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2392 if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2393 denom.ceff *= pow10(diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2394 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2395 quotient.ceff = denom.ceff / numer.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2396 quotient.expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2397 quotient.sign = denom.sign ^ numer.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2398 quotient.digits = numDigits(quotient.ceff, context.precision);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2399 if (quotient.ceff == 0) quotient.spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2400 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2401 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2402
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2403 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2404 write("div-int......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2405 Decimal dividend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2406 Decimal divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2407 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2408 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2409 dividend = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2410 divisor = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2411 quotient = divideInteger(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2412 expd = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2413 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2414 dividend = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2415 quotient = divideInteger(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2416 expd = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2417 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2418 dividend = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2419 divisor = "0.3";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2420 quotient = divideInteger(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2421 assert(quotient == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2422 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2423 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2424
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2425 Decimal remainder(const Decimal dividend, const Decimal divisor) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2426 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2427 if (isInvalidDivision(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2428 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2429 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2430 if (isZeroDividend(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2431 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2432 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2433 quotient = dividend - divisor * divideInteger(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2434 return quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2435 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2436
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2437 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2438 write("remainder....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2439 Decimal dividend;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2440 Decimal divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2441 Decimal quotient;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2442 Decimal expected;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2443 dividend = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2444 divisor = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2445 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2446 expected = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2447 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2448 dividend = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2449 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2450 expected = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2451 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2452 dividend = -10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2453 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2454 expected = -1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2455 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2456 dividend = 10.2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2457 divisor = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2458 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2459 expected = "0.2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2460 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2461 dividend = 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2462 divisor = 0.3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2463 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2464 expected = "0.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2465 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2466 dividend = 3.6;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2467 divisor = 1.3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2468 quotient = remainder(dividend, divisor);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2469 expected = "1.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2470 assert(quotient == expected);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2471 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2472 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2473
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2474 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2475 // rounding
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2476 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2477
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2478 public Decimal rint(const Decimal dec){
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2479 if (dec.isSignaling) return invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2480 if (dec.isSpecial) return dec;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2481 if (dec.expo >= 0) return dec;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2482 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2483 context.precision = dec.digits;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2484 Decimal result = quantize(dec, ONE);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2485 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2486 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2487 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2488
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2489 public Decimal nearbyint(const Decimal dec){
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2490 // this operation shouldn't affect the inexact or rounded flags
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2491 // so we'll save them in case they were already set.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2492 bool inexact = context.getFlag(INEXACT);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2493 bool rounded = context.getFlag(ROUNDED);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2494 Decimal result = rint(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2495 context.setFlag(INEXACT, inexact);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2496 context.setFlag(ROUNDED, rounded);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2497 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2498 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2499
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2500 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2501 write("rnd-int-ex...");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2502 Decimal dec;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2503 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2504 Decimal actual;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2505 dec = 2.1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2506 expd = 2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2507 actual = rint(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2508 assert(actual == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2509 dec = 100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2510 expd = 100;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2511 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2512 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2513 dec = "100.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2514 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2515 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2516 dec = "101.5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2517 expd = 102;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2518 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2519 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2520 dec = "-101.5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2521 expd = -102;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2522 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2523 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2524 dec = "10E+5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2525 expd = "1.0E+6";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2526 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2527 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2528 dec = "7.89E+77";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2529 expd = "7.89E+77";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2530 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2531 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2532 dec = "-Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2533 expd = "-Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2534 assert(rint(dec) == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2535 assert(rint(dec).toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2536 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2537 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2538
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2539 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2540 * Clips the coefficient of the number to the specified precision.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2541 * Returns the remainder for adjustments based on rounding mode.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2542 * Sets the ROUNDED and INEXACT flags.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2543 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2544 private BigInt shorten(ref Decimal number) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2545 BigInt remainder = BIG_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2546 int diff = number.digits - context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2547 if (diff <= 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2548 return remainder;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2549 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2550 context.setFlag(ROUNDED);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2551 if (context.precision == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2552 remainder = number.ceff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2553 number.ceff = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2554 number.digits = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2555 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2556 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2557 BigInt divisor = pow10(diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2558 remainder = number.ceff % divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2559 number.ceff /= divisor;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2560 number.digits = context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2561 number.expo += diff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2562 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2563 if (remainder != BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2564 context.setFlag(INEXACT);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2565 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2566 return remainder;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2567 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2568
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2569 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2570 * Increments the coefficient by 1. If this causes an overflow, divides by 10.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2571 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2572 private void increment(ref BigInt number) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2573 number++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2574 if (lastDigit(number) == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2575 number /= 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2576 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2577 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2578
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2579 // TODO: need to signal inexact and rounded.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2580 private void roundByMode(ref Decimal number) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2581 BigInt remainder = shorten(number);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2582
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2583 // if the rounded flag is not set by the shorten operation, return
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2584 if (!context.getFlag(ROUNDED)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2585 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2586 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2587 // if the remainder is zero, return
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2588 if (remainder == BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2589 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2590 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2591
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2592 switch (context.mode) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2593 case Rounding.DOWN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2594 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2595 case Rounding.HALF_UP:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2596 if (firstDigit(remainder) >= 5) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2597 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2598 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2599 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2600 case Rounding.HALF_EVEN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2601 BigInt test = 5 * pow10(numDigits(remainder,1)-1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2602 int result = remainder.opCmp(test);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2603 if (result > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2604 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2605 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2606 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2607 if (result < 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2608 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2609 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2610 // if last digit is odd...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2611 if (lastDigit(number.ceff) & 1 == 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2612 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2613 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2614 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2615 case Rounding.CEILING:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2616 if (!number.sign && remainder != BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2617 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2618 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2619 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2620 case Rounding.FLOOR:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2621 if (number.sign && remainder != BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2622 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2623 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2624 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2625 case Rounding.HALF_DOWN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2626 if (firstDigit(remainder) > 5) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2627 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2628 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2629 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2630 case Rounding.UP:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2631 if (remainder != BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2632 increment(number.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2633 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2634 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2635 } // end switch(mode)
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2636 } // end roundByMode()
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2637
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2638 public void round(ref Decimal number) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2639 if (!number.isFinite) return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2640
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2641 context.clearFlags();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2642 // check for subnormal
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2643 bool subnormal = false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2644 if (number.isSubnormal()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2645 context.setFlag(SUBNORMAL);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2646 subnormal = true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2647 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2648
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2649 // check for overflow
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2650 if (number.overflow()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2651 context.setFlag(OVERFLOW);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2652 switch (context.mode) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2653 case Rounding.HALF_UP:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2654 case Rounding.HALF_EVEN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2655 case Rounding.HALF_DOWN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2656 case Rounding.UP:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2657 bool sign = number.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2658 number = POS_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2659 number.sign = sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2660 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2661 case Rounding.DOWN:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2662 bool sign = number.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2663 number = context.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2664 number.sign = sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2665 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2666 case Rounding.CEILING:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2667 if (number.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2668 number = context.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2669 number.sign = true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2670 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2671 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2672 number = POS_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2673 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2674 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2675 case Rounding.FLOOR:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2676 if (number.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2677 number = NEG_INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2678 } else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2679 number = context.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2680 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2681 break;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2682 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2683 context.setFlag(INEXACT);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2684 context.setFlag(ROUNDED);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2685 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2686 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2687 roundByMode(number);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2688 // check for underflow
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2689 if (number.isSubnormal /+&& number.isInexact+/) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2690 context.setFlag(SUBNORMAL);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2691 int diff = context.eTiny - number.adjustedExponent();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2692 if (diff > number.digits) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2693 number.ceff = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2694 number.expo = context.eTiny;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2695 } else if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2696 writeln("We got a tiny one!");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2697 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2698 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2699 // check for zero
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2700 if (number.spval == SpVal.CLEAR && number.ceff == BIG_ZERO) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2701 number.spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2702 // subnormal rounding to zero == clamped
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2703 // Spec. p. 51
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2704 if (subnormal) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2705 context.setFlag(CLAMPED);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2706 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2707 return;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2708 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2709 } // end round()
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2710
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2711 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2712 write("round........");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2713 Decimal before = Decimal(1234567890);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2714 Decimal after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2715 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2716 context.precision = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2717 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2718 assert(after.toString() == "1.23E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2719 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2720 context.precision = 4;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2721 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2722 assert(after.toString() == "1.235E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2723 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2724 context.precision = 5;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2725 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2726 assert(after.toString() == "1.2346E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2727 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2728 context.precision = 6;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2729 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2730 assert(after.toString() == "1.23457E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2731 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2732 context.precision = 7;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2733 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2734 assert(after.toString() == "1.234568E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2735 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2736 context.precision = 8;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2737 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2738 assert(after.toString() == "1.2345679E+9");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2739 before = "1235";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2740 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2741 context.precision = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2742 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2743 assert(after.toAbstract() == "[0,124,1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2744 before = "12359";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2745 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2746 context.precision = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2747 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2748 assert(after.toAbstract() == "[0,124,2]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2749 before = "1245";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2750 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2751 context.precision = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2752 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2753 assert(after.toAbstract() == "[0,124,1]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2754 before = "12459";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2755 after = before;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2756 context.precision = 3;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2757 round(after);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2758 assert(after.toAbstract() == "[0,125,2]");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2759 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2760 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2761 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2762
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2763 public void setDigits(ref Decimal number) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2764 int diff = number.digits - context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2765 if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2766 round(number);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2767 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2768 else if (diff < 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2769 number.ceff *= pow10(-diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2770 number.expo += diff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2771 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2772 number.digits = context.precision;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2773 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2774
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2775 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2776 * Returns the number which is equal in value and sign
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2777 * to the first operand and which has its exponent set
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2778 * to be equal to the exponent of the second operand.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2779 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2780 // TODO: this has unusual flag rules
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2781 Decimal quantize(const Decimal dcm1, const Decimal dcm2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2782 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2783 if (isInvalidOperation(dcm1, dcm2, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2784 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2785 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2786 if (dcm1.isInfinite != dcm2.isInfinite() ||
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2787 dcm2.isInfinite != dcm1.isInfinite()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2788 return invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2789 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2790 if (dcm1.isInfinite() && dcm2.isInfinite()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2791 return dcm1.dup;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2792 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2793 result = dcm1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2794 int diff = dcm1.expo - dcm2.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2795 if (diff == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2796 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2797 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2798 if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2799 result.ceff *= pow10(diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2800 result.digits += diff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2801 result.expo = dcm2.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2802 if (result.digits > context.precision) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2803 result = NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2804 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2805 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2806 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2807 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2808 pushContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2809 context.precision =
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2810 -diff > dcm1.digits ? 0 : dcm1.digits + diff;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2811 round(result);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2812 result.expo = dcm2.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2813 popContext();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2814 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2815 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2816 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2817
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2818 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2819 write("quantize.....");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2820 Decimal op1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2821 Decimal op2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2822 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2823 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2824 string str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2825 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2826 op2 = "0.001";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2827 expd = "2.170";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2828 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2829 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2830 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2831 op2 = "0.01";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2832 expd = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2833 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2834 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2835 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2836 op2 = "0.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2837 expd = "2.2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2838 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2839 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2840 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2841 op2 = "1e+0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2842 expd = "2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2843 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2844 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2845 op1 = "2.17";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2846 op2 = "1e+1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2847 expd = "0E+1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2848 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2849 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2850 op1 = "-Inf";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2851 op2 = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2852 expd = "-Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2853 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2854 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2855 op1 = "2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2856 op2 = "Infinity";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2857 expd = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2858 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2859 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2860 op1 = "-0.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2861 op2 = "1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2862 expd = "-0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2863 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2864 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2865 op1 = "-0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2866 op2 = "1e+5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2867 expd = "-0E+5";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2868 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2869 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2870 op1 = "+35236450.6";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2871 op2 = "1e-2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2872 expd = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2873 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2874 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2875 op1 = "-35236450.6";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2876 op2 = "1e-2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2877 expd = "NaN";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2878 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2879 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2880 op1 = "217";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2881 op2 = "1e-1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2882 expd = "217.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2883 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2884 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2885 op1 = "217";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2886 op2 = "1e+0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2887 expd = "217";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2888 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2889 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2890 op1 = "217";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2891 op2 = "1e+1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2892 expd = "2.2E+2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2893 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2894 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2895 op1 = "217";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2896 op2 = "1e+2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2897 expd = "2E+2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2898 result = quantize(op1, op2);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2899 assert(result.toString() == expd.toString());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2900 assert(result == expd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2901 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2902 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2903
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2904 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2905 * Reduces operand to simplest form. All trailing zeros are removed.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2906 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2907 // TODO: has non-standard flag setting
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2908 Decimal reduce(const Decimal dcm) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2909 Decimal result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2910 if (isInvalidOperation(dcm, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2911 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2912 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2913 result = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2914 if (!result.isFinite()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2915 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2916 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2917 BigInt temp = result.ceff % 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2918 while (result.ceff != 0 && temp == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2919 result.expo++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2920 result.ceff = result.ceff / 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2921 temp = result.ceff % 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2922 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2923 if (result.ceff == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2924 result.spval = SpVal.ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2925 result.expo = 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2926 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2927 result.digits = numDigits(result.ceff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2928 return result;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2929 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2930
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2931 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2932 write("reduce.......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2933 Decimal dec;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2934 Decimal red;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2935 string str;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2936 dec = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2937 str = "2.1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2938 red = reduce(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2939 assert(red.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2940 dec = "-2.0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2941 str = "-2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2942 red = reduce(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2943 assert(red.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2944 dec = "1.200";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2945 str = "1.2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2946 red = reduce(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2947 assert(red.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2948 dec = "-120";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2949 str = "-1.2E+2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2950 red = reduce(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2951 assert(red.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2952 dec = "120.00";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2953 str = "1.2E+2";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2954 red = reduce(dec);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2955 assert(red.toString() == str);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2956 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2957 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2958
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2959 private:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2960
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2961 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2962 * Sets the invalid-operation flag and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2963 * returns a quiet NaN.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2964 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2965 Decimal invalidOp() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2966 context.flags |= INVALID_OPERATION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2967 return NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2968 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2969
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2970 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2971 * aligns the two operands by raising the smaller exponent
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2972 * to the value of the larger exponent, and adjusting the
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2973 * coefficient so the value remains the same.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2974 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2975 void alignOps(ref Decimal op1, ref Decimal op2) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2976 int diff = op1.expo - op2.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2977 if (diff > 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2978 op1.ceff *= pow10(diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2979 op1.expo = op2.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2980 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2981 else if (diff < 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2982 op2.ceff *= pow10(-diff);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2983 op2.expo = op1.expo;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2984 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2985 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2986
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2987 /*
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2988 * "The result of any arithmetic operation which has an operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2989 * which is a NaN (a quiet NaN or a signaling NaN) is [s,qNaN]
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2990 * or [s,qNaN,d]. The sign and any diagnostic information is copied
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2991 * from the first operand which is a signaling NaN, or if neither is
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2992 * signaling then from the first operand which is a NaN."
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2993 * -- General Decimal Arithmetic Specification, p. 24
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2994 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2995 bool isInvalidOperation(const Decimal dcm1, const Decimal dcm2,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2996 ref Decimal result) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2997 // if either operand is an sNaN...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2998 if (dcm1.isSignaling || dcm2.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
2999 // set the result to the first sNaN operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3000 result = dcm1.isSignaling ? dcm1 : dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3001 // retain sign and payload; convert to qNaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3002 result.spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3003 // flag the invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3004 context.flags |= INVALID_OPERATION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3005 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3006 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3007 // ...else if either operand is a qNaN...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3008 if (dcm1.isQuiet || dcm2.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3009 // set the result to the first qNaN operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3010 result = dcm1.isQuiet ? dcm1 : dcm2;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3011 // flag the invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3012 context.flags |= INVALID_OPERATION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3013 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3014 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3015 // ...otherwise, no flags are set and result is unchanged
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3016 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3017 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3018
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3019 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3020 write("invalid......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3021 Decimal dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3022 Decimal expd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3023 Decimal actual;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3024
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3025 dcm = "sNaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3026 expd = "NaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3027 actual = abs(dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3028 assert(actual.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3029 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3030 assert(actual.toAbstract == expd.toAbstract);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3031 dcm = "NaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3032 actual = abs(dcm);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3033 assert(actual.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3034 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3035 assert(actual.toAbstract == expd.toAbstract);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3036
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3037 dcm = "sNaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3038 expd = "NaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3039 actual = -dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3040 assert(actual.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3041 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3042 assert(actual.toAbstract == expd.toAbstract);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3043 dcm = "NaN123";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3044 actual = -dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3045 assert(actual.isQuiet);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3046 assert(context.flags && INVALID_OPERATION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3047 assert(actual.toAbstract == expd.toAbstract);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3048 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3049 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3050
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3051 /*
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3052 * "The result of any arithmetic operation which has an operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3053 * which is a NaN (a quiet NaN or a signaling NaN) is [s,qNaN]
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3054 * or [s,qNaN,d]. The sign and any diagnostic information is copied
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3055 * from the first operand which is a signaling NaN, or if neither is
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3056 * signaling then from the first operand which is a NaN."
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3057 * -- General Decimal Arithmetic Specification, p. 24
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3058 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3059 bool isInvalidOperation(const Decimal dcm, ref Decimal result) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3060 // if the operand is an sNaN...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3061 if (dcm.isSignaling) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3062 // set the result to the sNaN operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3063 result = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3064 // retain sign and payload; convert to qNaN
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3065 result.spval = SpVal.QNAN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3066 // flag the invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3067 context.flags |= INVALID_OPERATION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3068 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3069 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3070 // ...else if the operand is a qNaN...
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3071 if (dcm.isQuiet) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3072 // set the result to the qNaN operand
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3073 result = dcm;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3074 // flag the invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3075 context.flags |= INVALID_OPERATION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3076 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3077 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3078 // ...otherwise, no flags are set and result is unchanged
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3079 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3080 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3081
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3082 // TODO: add unit tests here for operations that apply
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3083 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3084
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3085 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3086
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3087 /+/*
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3088 * -- General Decimal Arithmetic Specification, p. 52, "Invalid operation"
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3089 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3090 bool isInvalidAddition(Decimal op1, Decimal op2, ref Decimal result) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3091 if (isInvalidOperation(op1, op2, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3092 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3093 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3094 // if both operands are infinite
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3095 if (op1.isInfinite && op2.isInfinite) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3096 // (+inf) + (-inf) => invalid operation
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3097 if (op1.sign != op2.sign) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3098 result = invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3099 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3100 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3101 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3102 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3103 }+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3104
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3105 /*
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3106 * -- General Decimal Arithmetic Specification, p. 52, "Invalid operation"
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3107 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3108 bool isInvalidMultiplication(Decimal op1, Decimal op2, ref Decimal result) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3109 if (isInvalidOperation(op1, op2, result)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3110 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3111 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3112 if (op1.isZero && op2.isInfinite || op1.isInfinite && op2.isZero) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3113 result = NaN;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3114 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3115 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3116 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3117 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3118
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3119 /*
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3120 * -- General Decimal Arithmetic Specification, p. 52, "Invalid operation"
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3121 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3122 bool isInvalidDivision(Decimal dividend, Decimal divisor, ref Decimal quotient) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3123 if (isInvalidOperation(dividend, divisor, quotient)) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3124 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3125 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3126 if (divisor.isZero()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3127 if (dividend.isZero()) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3128 quotient = invalidOp();
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3129 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3130 else {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3131 quotient.spval = SpVal.INF;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3132 context.flags |= DIVISION_BY_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3133 quotient.ceff = BIG_ZERO;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3134 quotient.sign = dividend.sign ^ divisor.sign;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3135 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3136 return true;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3137 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3138 return false;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3139 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3140
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3141 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3142 // unit tests
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3143 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3144
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3145 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3146 // additions to BigInt
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3147 //--------------------------------
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3148
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3149 private:
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3150 static immutable BigInt BIG_ZERO = { [0] };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3151 static immutable BigInt BIG_ONE = { [1] };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3152 static immutable BigInt BIG_FIVE = { [5] };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3153 static immutable BigInt BIG_TEN = { [10] };
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3154
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3155 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3156 * Returns the number of decimal digits in BigInt value.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3157 * There are probably significant efficiency gains available.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3158 **/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3159 uint numDigits(const BigInt big, int n = 1) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3160 if (big == 0) return 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3161 if (n <= 0) n = 1;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3162 int m = n;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3163 while (big < pow10(m-1)) m--;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3164 if (m != n) return m;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3165 while (big >= pow10(m)) m++;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3166 return m;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3167 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3168
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3169 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3170 * Returns a BigInt with the value of 10 raised to the specified power.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3171 * There are probably significant efficiency gains available.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3172 **/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3173 public BigInt pow10(uint power) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3174 static immutable int BILLION = 1000000000;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3175 static immutable int array[10] =
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3176 [ 1, 10, 100, 1000, 10000, 100000, 1000000,
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3177 10000000, 100000000, BILLION ];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3178
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3179 if (power < 10) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3180 return BigInt(array[power]);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3181 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3182 BigInt big = BigInt(BILLION);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3183 power -= 9;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3184 int quo = power / 9;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3185 int rem = power % 9;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3186 for (int i = 0; i < quo; i++) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3187 big *= BILLION;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3188 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3189 return big * array[rem];
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3190 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3191
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3192 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3193 * Returns the first decimal digit of the specified BigInt.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3194 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3195 uint firstDigit(BigInt big) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3196 uint digits = numDigits(big, 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3197 if (digits == 0) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3198 return 0;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3199 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3200 BigInt bfd = big / pow10(digits - 1);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3201 uint ifd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3202 bfd.castTo(ifd);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3203 return ifd;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3204 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3205
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3206 /**
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3207 * Returns the last decimal digit of the specified BigInt.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3208 */
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3209 uint lastDigit(BigInt big) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3210 return big % 10;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3211 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3212
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3213 unittest {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3214 write("bigint.......");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3215 string str = "1";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3216 BigInt big = pow10(0);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3217 assert(str == big.toString);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3218 for (int i = 1; i < 35; i++) {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3219 str ~= "0";
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3220 big = pow10(i);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3221 assert(str == big.toString);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3222 assert(numDigits(big) == str.length);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3223 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3224 writeln("passed");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3225 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3226
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3227 public void main() {
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3228 writeln("Hello, world!");
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3229 /+ writeln("eTiny = ", context.eTiny);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3230 writeln("tiny min = ", Decimal(1, context.eTiny));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3231 writeln("tiny min = ", Decimal(1, context.eTiny - 1));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3232 writeln("max = ", context.max());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3233 writeln("max1 = ", Decimal(999999999, 99));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3234 writeln("dig = ", context.dig());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3235 writeln("eps = ", context.epsilon());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3236 writeln("smallest = ", context.min_normal()*context.epsilon());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3237 writeln("1/epsilon = ", Decimal(1)/context.epsilon());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3238 writeln("max * min = ", context.max * context.min_normal);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3239 writeln("mant_dig = ", context.mant_dig);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3240 writeln("min_exp = ", context.min_exp);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3241 writeln("max_exp = ", context.max_exp);+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3242
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3243
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3244 // TODO: this next one goes crazy -- shows need for checks on construction
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3245 // TODO: turns out this is being converted to a double (or real) and
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3246 // then it's really weird.
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3247 // writeln("bigger = ", Decimal(999999999999));
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3248 // float f = float.max;
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3249 // TODO: convert these to assserts
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3250 /+ writeln("f.max = ", f);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3251 writeln("f.min = ", float.min);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3252 writeln("f = ", 2 * float.min);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3253 writeln("d.max = ", Decimal.max());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3254 writeln("d.min = ", Decimal.min_normal());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3255 writeln("2 * d.min = ", 2 * Decimal.min_normal());
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3256 writeln("0.1 * d.min = ", 0.1 * Decimal.min_normal());+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3257 // TODO: move this to unittesting
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3258 /+ Decimal dec = Decimal(PI);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3259 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3260 dec = Decimal(PI, 19);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3261 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3262 dec = Decimal(1.3, 25);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3263 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3264 dec = Decimal(0.1, 25);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3265 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3266 dec = Decimal(2.0, 25);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3267 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3268 dec = Decimal(200.5, 25);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3269 writeln("pi = ", dec );
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3270 writeln(double.dig);
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3271 writeln(real.dig);+/
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3272 }
42cf4db6be32 Creation
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
3273