Mercurial > projects > decimal
annotate src/decimal/bcd.d @ 10:f925fe996255
added cast, clip, power
author | Paul (paul.d.anderson@comcast.net) |
---|---|
date | Thu, 25 Mar 2010 20:05:00 -0700 |
parents | 48d564218e05 |
children | 8e5f172ec55c |
rev | line source |
---|---|
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1 /** |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
2 * A D programming language implementation of the |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
3 * General Decimal Arithmetic Specification, |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
4 * Version 1.70, (25 March 2009). |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
5 * |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
6 * by Paul D. Anderson |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
7 * |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
8 * Boost Software License - Version 1.0 - August 17th, 2003 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
9 * |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
10 * Permission is hereby granted, free of charge, to any person or organization |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
11 * obtaining a copy of the software and accompanying documentation covered by |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
12 * this license (the "Software") to use, reproduce, display, distribute, |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
13 * execute, and transmit the Software, and to prepare derivative works of the |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
14 * Software, and to permit third-parties to whom the Software is furnished to |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
15 * do so, all subject to the following: |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
16 * |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
17 * The copyright notices in the Software and this entire statement, including |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
18 * the above license grant, this restriction and the following disclaimer, |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
19 * must be included in all copies of the Software, in whole or in part, and |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
20 * all derivative works of the Software, unless such copies or derivative |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
21 * works are solely in the form of machine-executable object code generated by |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
22 * a source language processor. |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
23 * |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
26 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
27 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
28 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
29 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
30 * DEALINGS IN THE SOFTWARE. |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
31 **/ |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
32 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
33 module decimal.bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
34 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
35 import std.algorithm: max; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
36 import std.conv: ConvError; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
37 import std.math; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
38 import std.stdio: write, writeln; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
39 import std.string: strip; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
40 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
41 alias ubyte Digit; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
42 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
43 public immutable Bcd ZERO = { digits:[0] }; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
44 public immutable Bcd ONE = { digits:[1] }; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
45 public immutable Bcd NEG_ONE = { sign:true, digits:[1] }; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
46 |
10 | 47 /+static this() { |
48 immutable(Bcd) MAX_LONG = cast(immutable) Bcd(long.max); | |
49 // MAX_LONG = cast(immutable) Bcd(long.max); | |
50 }+/ | |
51 | |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
52 /** |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
53 * Enumeration of available rounding modes. |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
54 */ |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
55 public enum Rounding { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
56 HALF_EVEN, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
57 HALF_DOWN, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
58 HALF_UP, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
59 DOWN, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
60 UP, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
61 FLOOR, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
62 CEILING, |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
63 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
64 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
65 /** |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
66 * Provides BCD-encoded integral values of arbitrary length. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
67 * |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
68 * Advantages of BCD: |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
69 * To/from string is easy. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
70 * Easy to pull values of individual digits. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
71 * Easy to multiply and divide by powers of 10. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
72 * |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
73 * Disadvantages of BCD: |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
74 * Significantly less compact representation. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
75 * Operations are carried out bytewise, requiring more iterations. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
76 * Extra steps required for addition. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
77 * |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
78 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
79 public struct Bcd { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
80 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
81 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
82 // members |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
83 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
84 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
85 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
86 * The sign of the BCD integer. Sign is kept explicitly |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
87 * and not encoded in the number. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
88 **/ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
89 private bool sign = false; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
90 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
91 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
92 * An array of decimal digits in reverse (right-to-left) order |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
93 * representing an integral value. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
94 * Trailing zeros have no effect on the value of the number; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
95 * they correspond to leading zeros in a left-to-right representation. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
96 **/ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
97 private Digit[] digits = [ 0 ]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
98 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
99 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
100 // construction |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
101 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
102 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
103 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
104 // copy construction |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
105 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
106 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
107 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
108 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
109 * Copy constructor. Returns a (non-const) copy of the argument. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
110 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
111 public this(const Bcd bcd) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
112 sign = bcd.sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
113 digits = bcd.digits.dup; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
114 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
115 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
116 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
117 * Copies a BCD integer and adjusts the number of digits, |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
118 * padding or turncating, if necessary. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
119 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
120 public this(const Bcd bcd, uint numDigits) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
121 this(bcd); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
122 setNumDigits(numDigits); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
123 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
124 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
125 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
126 // construction from integer types. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
127 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
128 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
129 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
130 * Constructs a BCD integer from a (signed) byte, short, int or long value. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
131 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
132 public this(const long n) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
133 ulong m; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
134 if (n < 0) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
135 sign = true; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
136 m = std.math.abs(n); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
137 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
138 else { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
139 sign = false; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
140 m = n; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
141 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
142 Digit[20] dig; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
143 int i = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
144 do { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
145 ulong q = m/10; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
146 ulong r = m%10; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
147 dig[i] = cast(Digit) r; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
148 m = q; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
149 i++; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
150 } while (m > 0); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
151 digits = dig[0..i].dup; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
152 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
153 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
154 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
155 * Constructs a BCD integer from a (signed) byte, short, |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
156 * int or long value, and then adjusts the number of digits, |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
157 * padding or truncating as needed. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
158 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
159 public this(const long n, uint numDigits) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
160 this = n; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
161 setNumDigits(numDigits); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
162 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
163 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
164 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
165 write("this(long).."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
166 Bcd p; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
167 p = -1234; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
168 assert(p == Bcd("-1234")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
169 p = 12345678L; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
170 assert(p == Bcd("12345678")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
171 p = Bcd(-19166586400L); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
172 assert(p == Bcd("-19166586400")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
173 p = Bcd(139676498390L); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
174 assert(p == Bcd("139676498390")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
175 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
176 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
177 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
178 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
179 // construction from a string. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
180 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
181 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
182 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
183 * Constructs a BCD integer from a string representation. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
184 * If the string has leading zeros they are retained internally. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
185 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
186 public this(const string str) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
187 this = parse(str); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
188 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
189 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
190 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
191 // member access functions |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
192 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
193 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
194 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
195 // access to the sign of the number |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
196 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
197 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
198 const bool isSigned() { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
199 return sign; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
200 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
201 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
202 void setSign(bool sign) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
203 this.sign = sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
204 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
205 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
206 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
207 // access to the digits |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
208 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
209 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
210 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
211 * Returns the number of digits in this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
212 * Includes leading zero digits. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
213 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
214 const uint numDigits() { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
215 return digits.length; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
216 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
217 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
218 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
219 * Adjusts the number of digits in this BCD integer, |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
220 * padding or truncating if necessary. |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
221 * If truncating, first leading zeros are stripped away, then |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
222 * the remainder is clipped. |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
223 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
224 void setNumDigits(uint n) { |
10 | 225 if (n == 0) n++; |
226 digits.length = n; | |
227 } | |
228 | |
229 /+ /** | |
230 * Adjusts the number of digits in this BCD integer, | |
231 * padding or truncating if necessary. | |
232 * If truncating, first leading zeros are stripped away, then | |
233 * the remainder is clipped. | |
234 */ | |
235 void setNumDigits(uint n) { | |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
236 stripl(this); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
237 if (n > digits.length) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
238 digits.length = n; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
239 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
240 else { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
241 this = truncate(this, n); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
242 } |
10 | 243 }+/ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
244 |
10 | 245 /+unittest { |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
246 write("setWidth..."); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
247 Bcd a; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
248 a = 1234567; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
249 a.setNumDigits(5); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
250 assert(a == Bcd(12345)); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
251 a.setNumDigits(9); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
252 assert(a.toString == "000012345"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
253 writeln("passed"); |
10 | 254 }+/ |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
255 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
256 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
257 * Returns the first digit of this BCD integer. If the |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
258 * integer has leading zeros this function will return |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
259 * zero, but the value of the number is not necessarily zero. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
260 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
261 const uint firstDigit() { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
262 return digits[$-1]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
263 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
264 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
265 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
266 * Returns the last digit of this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
267 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
268 const uint lastDigit() { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
269 return digits[0]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
270 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
271 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
272 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
273 * Returns the specified digit of this BCD integer. The index is |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
274 * zero based, i.e., getDigit(0) returns the first digit. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
275 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
276 const int getDigit(int n) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
277 return digits[$-n-1]; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
278 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
279 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
280 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
281 * Sets the specified digit of this BCD integer to the specified value. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
282 * The index is zero based, i.e., getDigit(0) returns the first digit. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
283 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
284 void setDigit(uint n, Digit value) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
285 assert(value < 10); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
286 digits[$-n-1] = value; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
287 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
288 |
10 | 289 /+ unittest { |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
290 write("digits..."); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
291 Bcd bcd; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
292 bcd = 12345678; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
293 assert(bcd.numDigits() == 8); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
294 assert(bcd.firstDigit() == 1); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
295 assert(bcd.lastDigit() == 8); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
296 assert(bcd.getDigit(3) == 4); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
297 bcd.setDigit(3, 7); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
298 assert(bcd.getDigit(3) == 7); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
299 bcd.setNumDigits(10); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
300 assert(bcd.numDigits == 10); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
301 assert(bcd.firstDigit() == 0); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
302 assert(bcd.getDigit(5) == 7); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
303 bcd.setNumDigits(5); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
304 assert(bcd.getDigit(2) == 3); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
305 writeln("passed"); |
10 | 306 }+/ |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
307 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
308 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
309 // Common object functions. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
310 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
311 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
312 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
313 * Returns a string representation of this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
314 * Leading zeros are displayed. The sign is displayed if |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
315 * the number is negative. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
316 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
317 const string toString() { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
318 return format(this); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
319 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
320 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
321 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
322 write("toString..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
323 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
324 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
325 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
326 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
327 * Returns a hash code for this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
328 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
329 const hash_t toHash() { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
330 hash_t hash = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
331 foreach(Digit digit; digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
332 hash += digit; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
333 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
334 return hash; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
335 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
336 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
337 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
338 write("toHash..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
339 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
340 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
341 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
342 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
343 * Returns a mutable copy of this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
344 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
345 const Bcd dup() { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
346 Bcd bcd; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
347 bcd.sign = this.sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
348 bcd.digits = digits.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
349 return bcd; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
350 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
351 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
352 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
353 // Utility functions. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
354 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
355 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
356 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
357 * Returns true if the internal representation of |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
358 * this BCD integer has leading zeros. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
359 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
360 const bool hasLeadingZeros() { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
361 return numDigits > 1 && firstDigit == 0; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
362 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
363 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
364 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
365 write("hasLeadingZeros..."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
366 assert(!ZERO.hasLeadingZeros); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
367 Bcd b = Bcd(0); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
368 assert(!b.hasLeadingZeros); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
369 b = "-00000001"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
370 assert(b.hasLeadingZeros); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
371 b = "-00000000"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
372 assert(b.hasLeadingZeros); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
373 writeln("passed"); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
374 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
375 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
376 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
377 * Returns true if the value of this BCD integer is zero. |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
378 * Ignores leading zeros and sign. |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
379 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
380 const bool isZero() { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
381 Bcd b = canonical(this); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
382 if (b.numDigits > 1) return false; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
383 return b.lastDigit == 0; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
384 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
385 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
386 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
387 write("isZero........."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
388 assert(ZERO.isZero); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
389 Bcd b = Bcd(0); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
390 assert(b.isZero); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
391 b = "-00000001"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
392 assert(!b.isZero); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
393 b = "-00000000"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
394 assert(b.isZero); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
395 writeln("passed"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
396 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
397 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
398 //-------------------------------- |
10 | 399 // casting operators. |
400 //-------------------------------- | |
401 | |
402 const long opCast() { | |
403 Bcd MAX_LONG = Bcd(long.max); | |
404 Bcd MIN_LONG = Bcd(long.min); | |
405 | |
406 if (this > MAX_LONG || this < MIN_LONG) | |
407 throw new Exception("Can't cast -- out of range"); | |
408 | |
409 long n = 0; | |
410 foreach_reverse(Digit digit; digits) { | |
411 n = 10*n + digit; | |
412 } | |
413 return this.sign ? -n : n; | |
414 } | |
415 | |
416 unittest { | |
417 write("cast(long)..."); | |
418 Bcd a; | |
419 a = "12345678901234567890123456"; | |
420 // long n = cast(long) a; | |
421 a = 12345678L; | |
422 long n = cast(long) a; | |
423 assert(n == 12345678L); | |
424 int m = cast(int) a; | |
425 assert(m == 12345678L); | |
426 a = -a; | |
427 m = cast(int) a; | |
428 assert(m == -12345678L); | |
429 | |
430 writeln("passed"); | |
431 } | |
432 | |
433 | |
434 //-------------------------------- | |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
435 // Assignment operators. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
436 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
437 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
438 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
439 * Assignment operator for BCD integer to BCD integer operations. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
440 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
441 Bcd opAssign(const Bcd that) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
442 this.sign = that.sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
443 this.digits = that.digits.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
444 return this; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
445 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
446 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
447 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
448 * Converts the string argument into a BCD integer and assigns it |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
449 * to this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
450 */ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
451 void opAssign(const string str) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
452 this = Bcd(str); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
453 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
454 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
455 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
456 * Converts the integer argument into a BCD integer and assigns it |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
457 * to this BCD integer. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
458 */ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
459 void opAssign(const long n) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
460 this = Bcd(n); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
461 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
462 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
463 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
464 // index operator |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
465 Digit opIndex(uint index) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
466 return this.digits[index]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
467 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
468 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
469 // index assign operator |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
470 void opIndexAssign(Digit value, uint index) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
471 this.digits[index] = value; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
472 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
473 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
474 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
475 // unary operators |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
476 //-------------------------------- |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
477 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
478 const Bcd opPos() { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
479 return this.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
480 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
481 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
482 const Bcd opNeg() { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
483 return negate(this); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
484 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
485 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
486 const Bcd opCom() { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
487 return twosComp(this); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
488 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
489 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
490 const Bcd opNot() { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
491 return not(this); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
492 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
493 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
494 Bcd opPostInc() { |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
495 this = this + ONE; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
496 return this; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
497 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
498 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
499 Bcd opPostDec() { |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
500 this = this - ONE; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
501 return this; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
502 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
503 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
504 const Bcd opShl(int n) { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
505 return shift(this, n); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
506 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
507 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
508 Bcd opShlAssign(int n) { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
509 this = this << n; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
510 return this; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
511 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
512 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
513 const Bcd opShr(int n) { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
514 return shift(this, -n); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
515 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
516 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
517 Bcd opShrAssign(int n) { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
518 this = this >> n; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
519 return this; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
520 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
521 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
522 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
523 // binary operators |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
524 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
525 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
526 const Bcd opAdd(T:Bcd)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
527 return add(this, addend); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
528 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
529 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
530 const Bcd opAdd(T)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
531 return add(this, Bcd(addend)); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
532 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
533 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
534 Bcd opAddAssign(T)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
535 this = this + addend; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
536 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
537 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
538 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
539 const Bcd opSub(T:Bcd)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
540 return subtract(this, addend); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
541 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
542 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
543 const Bcd opSub(T)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
544 return subtract(this, Bcd(addend)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
545 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
546 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
547 Bcd opSubAssign(T)(const T addend) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
548 this = this - addend; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
549 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
550 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
551 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
552 const Bcd opMul(T:Bcd)(const T b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
553 return multiply(this, b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
554 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
555 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
556 const Bcd opMul(T)(const T b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
557 return multiply(this, Bcd(b)); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
558 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
559 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
560 Bcd opMulAssign(T)(const T b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
561 this = this * b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
562 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
563 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
564 |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
565 unittest { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
566 write("multiply..."); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
567 Bcd a, b, c; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
568 a = 105, b = -22; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
569 c = a * b; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
570 assert(c == -2310); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
571 c = 45; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
572 c *= 1205; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
573 // writeln("c = ", c); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
574 assert(c == 54225); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
575 writeln("passed"); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
576 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
577 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
578 const Bcd opDiv(T:Bcd)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
579 Bcd rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
580 return divide(this, b, rem); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
581 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
582 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
583 unittest { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
584 write("opDiv..."); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
585 Bcd a, b; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
586 a = 7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
587 b = 3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
588 assert(a/b == 2); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
589 writeln("passed"); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
590 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
591 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
592 const Bcd opDiv(T)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
593 Bcd rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
594 return divide(this, Bcd(b), rem); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
595 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
596 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
597 Bcd opDivAssign(T)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
598 this = this / b; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
599 return this; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
600 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
601 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
602 const Bcd opMod(T:Bcd)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
603 Bcd rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
604 divide(this, b, rem); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
605 return rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
606 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
607 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
608 unittest { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
609 write("opMod..."); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
610 Bcd a, b; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
611 a = 7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
612 b = 3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
613 assert(a % b == 1); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
614 writeln("passed"); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
615 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
616 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
617 const Bcd opMod(T)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
618 Bcd rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
619 divide(this, Bcd(b), rem); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
620 return rem; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
621 } |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
622 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
623 Bcd opModAssign(T)(const T b) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
624 this = this % b; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
625 return this; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
626 } |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
627 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
628 const Bcd opAnd(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
629 return and(this, a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
630 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
631 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
632 Bcd opAndAssign(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
633 this = this & a; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
634 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
635 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
636 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
637 const Bcd opOr(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
638 return or(this, a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
639 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
640 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
641 Bcd opOrAssign(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
642 this = this | a; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
643 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
644 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
645 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
646 const Bcd opXor(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
647 return xor(this, a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
648 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
649 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
650 Bcd opXorAssign(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
651 this = this ^ a; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
652 return this; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
653 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
654 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
655 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
656 // comparison, equality operators |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
657 //-------------------------------- |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
658 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
659 const int opCmp(T:Bcd)(const T that) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
660 return compare(this, that); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
661 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
662 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
663 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
664 write("compare..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
665 Bcd a,b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
666 a = 100; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
667 b = 5; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
668 assert(a > b); |
10 | 669 a = -100; |
670 b = 5; | |
671 assert(a < b); | |
672 a = -100; | |
673 b = -5; | |
674 assert(a < b); | |
675 a = 100; | |
676 b = -5; | |
677 assert(a > b); | |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
678 a = 5; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
679 b = 100; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
680 assert(a < b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
681 assert(b > a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
682 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
683 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
684 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
685 const int opCmp(T)(const T that) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
686 return opCmp(Bcd(that)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
687 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
688 |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
689 const bool opEquals(T:Bcd)(const T that) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
690 Bcd a = canonical(this); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
691 Bcd b = canonical(that); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
692 // TODO: this is wrong -- signs can differ -0 and + 0 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
693 if (this.sign != that.sign) return false; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
694 if (a.digits.length != b.digits.length) return false; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
695 foreach_reverse(int i, Digit digit; a.digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
696 if (digit != b.digits[i]) return false; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
697 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
698 return true; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
699 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
700 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
701 const bool opEquals(T)(const T that) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
702 return opEquals(Bcd(that)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
703 } |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
704 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
705 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
706 write("equals..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
707 assert(Bcd(0) == Bcd(0)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
708 assert(Bcd(4) == Bcd(4)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
709 assert(Bcd(40) == Bcd(40)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
710 assert(Bcd(-400) == Bcd(-400)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
711 assert(Bcd(12345678) == Bcd(+12345678)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
712 assert(Bcd(40) != Bcd(53)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
713 assert(Bcd(402) != Bcd(531)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
714 assert(Bcd(402) != Bcd(-402)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
715 assert(Bcd(65432) != Bcd(65431)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
716 assert(Bcd(2) != Bcd(1)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
717 assert(Bcd(1) != Bcd(2)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
718 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
719 } |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
720 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
721 } // end struct Bcd |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
722 |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
723 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
724 public bool isCanonical(const Bcd a) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
725 // no leading zeros |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
726 if (a.hasLeadingZeros) return false; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
727 // not -0 |
10 | 728 /+ if (a.numDigits == 1 && a.firstDigit == 0) return !a.sign;+/ |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
729 return true; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
730 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
731 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
732 // Strips leading zeros and changes sign if == -0 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
733 public Bcd canonical(const Bcd a) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
734 Bcd d = a.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
735 if (isCanonical(a)) return d; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
736 stripl(d); |
10 | 737 /+ if (d.numDigits == 1 && d.firstDigit == 0) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
738 d.sign = false; |
10 | 739 }+/ |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
740 return d; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
741 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
742 |
10 | 743 |
744 private void clipFirst(ref Bcd a, uint n = 1) { | |
745 if (n == 0) return; | |
746 if (n >= a.digits.length) a = ZERO; | |
747 else a.digits = a.digits[0..$-n]; | |
748 } | |
749 | |
750 private void clipLast(ref Bcd a, uint n = 1) { | |
751 if (n == 0) return; | |
752 if (n >= a.digits.length) a = ZERO; | |
753 else a.digits = a.digits[n..$]; | |
754 } | |
755 | |
756 unittest { | |
757 write("clipping...."); | |
758 Bcd a; | |
759 a = 12345; | |
760 clipFirst(a); | |
761 assert(a == 2345); | |
762 clipLast(a); | |
763 assert(a == 234); | |
764 a = 1234567890; | |
765 clipFirst(a, 3); | |
766 assert(a == 4567890); | |
767 clipLast(a, 5); | |
768 assert(a == 45); | |
769 clipLast(a, 5); | |
770 assert(a == 0); | |
771 writeln("passed"); | |
772 } | |
773 | |
774 | |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
775 /** |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
776 * Strips leading zeros from the specified decint. |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
777 */ |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
778 private void stripl(ref Bcd a) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
779 if (a.hasLeadingZeros) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
780 foreach_reverse(int i, Digit digit; a.digits) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
781 if (i == 0 || digit != 0) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
782 a.digits.length = i+1; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
783 break; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
784 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
785 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
786 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
787 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
788 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
789 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
790 write("stripl......"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
791 Bcd b = Bcd("+00023"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
792 assert(b.toString == "00023"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
793 stripl(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
794 assert(b.toString == "23"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
795 b = "-00050432"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
796 stripl(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
797 assert(b.toString == "-50432"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
798 b = "-000"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
799 stripl(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
800 assert(b.toString == "-0"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
801 writeln("passed"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
802 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
803 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
804 /** |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
805 * Strips trailing zeros from the specified decint. |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
806 */ |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
807 private void stripr(ref Bcd a) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
808 int len = a.digits.length; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
809 foreach(int i, Digit digit; a.digits) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
810 if (i == len-1 || digit != 0) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
811 a.digits = a.digits[i..$]; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
812 break; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
813 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
814 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
815 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
816 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
817 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
818 write("stripl......"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
819 Bcd b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
820 b = 23; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
821 stripr(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
822 assert(b == 23); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
823 b = "-5000"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
824 stripr(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
825 assert(b.toString == "-5"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
826 b = "-000"; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
827 stripr(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
828 assert(b.toString == "-0"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
829 writeln("passed"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
830 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
831 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
832 //public string format(const Bcd bcd, bool showPlus = false, bool showLeadingZeros = false) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
833 public string format(const Bcd bcd) { |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
834 int len = bcd.digits.length; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
835 if (bcd.isSigned) len++; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
836 // if (bcd.isSigned || bcd.hasLeadingZeros) len++; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
837 char[] str = new char[len]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
838 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
839 int index = 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
840 if (bcd.sign) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
841 str[index] = '-'; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
842 index++; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
843 } |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
844 /+ if (bcd.hasLeadingZeros) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
845 str[index] = '+'; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
846 index++; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
847 }+/ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
848 foreach_reverse(Digit digit; bcd.digits) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
849 str[index] = cast(char) digit + '0'; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
850 index++; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
851 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
852 return str.idup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
853 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
854 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
855 public Bcd parse(string str) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
856 Bcd bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
857 // are leading zeros retained? |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
858 bool lz = false; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
859 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
860 // strip whitespace, convert to char array |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
861 char[] str1 = str.strip.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
862 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
863 // check for leading '-' |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
864 if (str1[0] == '-') { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
865 bcd.sign = true; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
866 str1 = str1[1..$]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
867 lz = true; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
868 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
869 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
870 // check for leading '+' |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
871 if (str1[0] == '+') { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
872 bcd.sign = false; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
873 str1 = str1[1..$]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
874 lz = true; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
875 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
876 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
877 // verify chars are digits, strip out underscores |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
878 int index = 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
879 char[] str2 = new char[str1.length]; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
880 foreach_reverse(char ch; str1) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
881 if (isDigit(ch)) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
882 str2[index] = ch; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
883 index++; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
884 continue; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
885 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
886 if (ch == '_') { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
887 continue; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
888 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
889 throw (new ConvError("Invalid character: " ~ ch)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
890 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
891 str2.length = index; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
892 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
893 bcd.digits.length = index; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
894 foreach(int i, char ch; str2) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
895 bcd.digits[i] = cast(Digit)(ch - '0'); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
896 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
897 |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
898 if (!lz) return canonical(bcd); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
899 return bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
900 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
901 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
902 private bool isDigit(const char ch) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
903 return (ch >= '0' && ch <= '9'); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
904 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
905 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
906 public Bcd negate(const Bcd a) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
907 Bcd b = a.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
908 b.sign = !a.sign; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
909 return b; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
910 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
911 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
912 public Bcd abs(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
913 return a.isSigned ? -a: +a; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
914 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
915 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
916 public int compare(const Bcd m, const Bcd n) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
917 Bcd a = canonical(m); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
918 Bcd b = canonical(n); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
919 if (!a.isSigned && b.isSigned) return 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
920 if (a.isSigned && !b.isSigned) return -1; |
10 | 921 if (!a.isSigned) { |
922 if (a.digits.length > b.digits.length) return 1; | |
923 if (a.digits.length < b.digits.length) return -1; | |
924 foreach_reverse(int i, Digit digit; a.digits) { | |
925 if (digit > b.digits[i]) return 1; | |
926 if (digit < b.digits[i]) return -1; | |
927 } | |
928 } | |
929 else { | |
930 if (a.digits.length > b.digits.length) return -1; | |
931 if (a.digits.length < b.digits.length) return 11; | |
932 foreach_reverse(int i, Digit digit; a.digits) { | |
933 if (digit > b.digits[i]) return -1; | |
934 if (digit < b.digits[i]) return 1; | |
935 } | |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
936 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
937 return 0; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
938 } |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
939 |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
940 unittest { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
941 write("strip..."); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
942 Bcd bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
943 bcd = "+00123"; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
944 assert(bcd.toString == "00123"); |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
945 bcd = canonical(bcd); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
946 // writeln("bcd = ", bcd); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
947 assert(bcd.toString == "123"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
948 bcd = "+000"; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
949 // writeln("bcd = ", bcd); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
950 assert(bcd.toString == "000"); |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
951 bcd = canonical(bcd); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
952 // writeln("bcd = ", bcd); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
953 writeln("passed"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
954 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
955 |
10 | 956 private bool sameLength(const Bcd a, const Bcd b) { |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
957 return a.numDigits == b.numDigits; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
958 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
959 |
10 | 960 private int setSameLength(ref Bcd a, ref Bcd b) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
961 if (sameLength(a, b)) return a.numDigits; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
962 uint alen = a.numDigits; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
963 uint blen = b.numDigits; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
964 if (alen > blen) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
965 b.setNumDigits(alen); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
966 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
967 else { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
968 a.setNumDigits(blen); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
969 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
970 return a.numDigits(); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
971 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
972 |
10 | 973 // TODO: really? private? |
974 private Bcd twosComp(const Bcd a) { | |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
975 Bcd b = Bcd(0, a.numDigits); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
976 foreach(int i, Digit digit; a.digits) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
977 b.digits[i] = digit == 0 ? 1 : 0 ; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
978 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
979 return b; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
980 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
981 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
982 unittest { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
983 write("com..."); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
984 Bcd bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
985 bcd = 123; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
986 assert(twosComp(bcd).toString == "000"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
987 bcd = 40509; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
988 assert(twosComp(bcd).toString == "01010"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
989 // writeln("bcd = ", bcd); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
990 // writeln("~bcd = ", twosComp(bcd)); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
991 writeln("passed"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
992 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
993 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
994 public int sgn(const Bcd bcd) { |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
995 if (bcd.isZero) return 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
996 return bcd.isSigned ? -1 : 1; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
997 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
998 |
10 | 999 public Bcd not(const Bcd a) { |
1000 Bcd b = a.dup; | |
1001 foreach(Digit digit; b.digits) { | |
1002 digit = not(digit); | |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1003 } |
10 | 1004 return b; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1005 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1006 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1007 private Digit not(const Digit a) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1008 return a != 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1009 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1010 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1011 public Bcd and(const Bcd x, const Bcd y) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1012 Bcd a = x.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1013 Bcd b = y.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1014 int len = setSameLength(a,b); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1015 Bcd result = Bcd(0, len); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1016 for (int i = 0; i < len; i++) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1017 result[i] = and(a[i], b[i]); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1018 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1019 return result; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1020 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1021 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1022 private Digit and(const Digit a, const Digit b) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1023 return a != 0 && b != 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1024 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1025 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1026 unittest { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1027 write("and..."); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1028 Bcd a; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1029 Bcd b; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1030 a = 123000; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1031 b = 123000; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1032 assert(and(a,b).toString == "111000"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1033 b = 12300; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1034 assert(and(a,b).toString == "011000"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1035 a = 1234567; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1036 b = 7654321; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1037 assert(and(a,b).toString == "1111111"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1038 a = 1010; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1039 b = 101; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1040 // writeln("a = ", a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1041 // writeln("b = ", b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1042 // writeln("and = ", and(a,b)); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1043 assert(and(a,b).isZero); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1044 writeln("passed"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1045 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1046 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1047 // TODO: looks like there's some room for templates or mixins here. |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1048 public Bcd or(const Bcd x, const Bcd y) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1049 Bcd a = x.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1050 Bcd b = y.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1051 int len = setSameLength(a,b); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1052 Bcd result = Bcd(0, len); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1053 for (int i = 0; i < len; i++) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1054 result[i] = or(a[i], b[i]); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1055 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1056 return result; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1057 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1058 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1059 private Digit or(const Digit a, const Digit b) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1060 return a != 0 || b != 0; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1061 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1062 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1063 public Bcd xor(const Bcd x, const Bcd y) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1064 Bcd a = x.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1065 Bcd b = y.dup; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1066 int len = setSameLength(a,b); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1067 Bcd result = Bcd(0, len); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1068 for (int i = 0; i < len; i++) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1069 result[i] = xor(a[i], b[i]); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1070 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1071 return result; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1072 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1073 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1074 private Digit xor(const Digit a, const Digit b) { |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1075 return (a == 0 && b != 0) || (a != 0 && b == 0); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1076 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1077 |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1078 // TODO: watch the leading zeros |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1079 public Bcd add(const Bcd x, const Bcd y) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1080 Bcd a = x.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1081 Bcd b = y.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1082 Bcd sum; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1083 if (a.sign == b.sign) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1084 sum = simpleAdd(a, b); |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1085 stripl(sum); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1086 sum.sign = a.sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1087 return sum; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1088 } |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1089 else { // signs differ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1090 bool sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1091 switch (compare(abs(a), abs(b))) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1092 case 0: |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1093 return ZERO.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1094 case 1: |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1095 sign = a.isSigned; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1096 break; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1097 case -1: |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1098 sign = b.isSigned; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1099 break; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1100 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1101 setSameLength(a, b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1102 sum = simpleAdd(a, tensComp(b)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1103 if (sum.firstDigit == 1) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1104 sum.digits = sum.digits[0..$-1]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1105 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1106 else { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1107 sum = tensComp(sum); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1108 } |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1109 stripl(sum); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1110 sum.sign = sign; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1111 } |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1112 return sum; |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1113 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1114 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1115 unittest { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1116 write("add...."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1117 Bcd a, b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1118 a = 1234; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1119 b = 4321; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1120 assert(a + b == 5555); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1121 a = 2000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1122 b = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1123 assert(a + b == 2001); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1124 a = -2000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1125 b = -1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1126 assert(a + b == -2001); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1127 a = 2000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1128 b = -1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1129 assert(a + b == 1999); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1130 a = -123; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1131 b = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1132 assert(a + b == -122); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1133 a = 123; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1134 b = -1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1135 assert(a + b == 122); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1136 a = -1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1137 b = 123; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1138 // writeln(); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1139 // writeln("a + b = ", a + b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1140 assert(a + b == 122); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1141 a = -123; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1142 b = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1143 assert(a + b == -122); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1144 a = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1145 b = -123; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1146 assert(a + b == -122); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1147 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1148 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1149 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1150 Bcd subtract(const Bcd a, const Bcd b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1151 return add(a, negate(b)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1152 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1153 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1154 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1155 * Adds two BCD integers without regard to sign |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1156 **/ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1157 private Bcd simpleAdd(const Bcd a, const Bcd b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1158 Bcd x = a.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1159 Bcd y = b.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1160 int len = setSameLength(x, y); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1161 Bcd sum = Bcd(0, len+1); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1162 Digit carry = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1163 uint i; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1164 // TODO: this is the place to stop adding zeros and |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1165 // just copy the rest of the digits. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1166 for (i = 0; i < len; i++) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1167 sum[i] = add(x[i], y[i], carry); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1168 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1169 if (carry) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1170 sum[i] = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1171 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1172 else { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1173 stripl(sum); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1174 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1175 return sum; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1176 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1177 |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1178 // TODO: need a clipFirst, clipLast method |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1179 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1180 /** |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1181 * Adds two digits and a carry digit. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1182 * Returns the (single-digit) sum and sets or resets the carry digit. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1183 **/ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1184 private Digit add(const Digit a, const Digit b, ref Digit carry) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1185 Digit sum = a + b + carry; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1186 carry = sum > 9; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1187 if (carry) sum -= 10; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1188 return sum; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1189 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1190 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1191 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1192 write("simpleAdd..."); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1193 Bcd a, b; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1194 a = 123; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1195 b = 222; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1196 Bcd sum = simpleAdd(a,b); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1197 assert(sum == 345); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1198 a = 2; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1199 b = 102000; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1200 sum = simpleAdd(a,b); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1201 assert(sum == 102002); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1202 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1203 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1204 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1205 private Bcd tensComp(const Bcd a) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1206 /+ foreach(Digit digit; a.digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1207 digit = 9 - digit; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1208 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1209 a = simpleAdd(a, ONE); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1210 return a;+/ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1211 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1212 Bcd x = Bcd(0, a.numDigits); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1213 foreach (int i, digit; a.digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1214 x[i] = 9 - digit; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1215 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1216 return simpleAdd(x, ONE); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1217 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1218 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1219 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1220 write("tensComp..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1221 Bcd a, b, c; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1222 a = 123456; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1223 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1224 // writeln("a = ", a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1225 // writeln("b = ", b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1226 c = 876544; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1227 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1228 a = Bcd(0, 4); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1229 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1230 c = 10000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1231 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1232 a = Bcd(1, 4); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1233 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1234 c = 9999; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1235 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1236 a = 9999; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1237 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1238 c = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1239 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1240 a = 10000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1241 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1242 c = 90000; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1243 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1244 a = 1; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1245 b = tensComp(a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1246 c = 9; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1247 // writeln("a = ", a); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1248 // writeln("b = ", b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1249 assert(b == c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1250 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1251 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1252 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1253 // TODO: there are lots of ways to speed this up. |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1254 public Bcd multiply(const Bcd a, const Bcd b) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1255 Bcd n, m; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1256 Bcd p = Bcd(0, a.numDigits + b.numDigits); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1257 if (a.numDigits > b.numDigits) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1258 n = canonical(a); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1259 m = canonical(b); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1260 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1261 else { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1262 n = canonical(b); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1263 m = canonical(a); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1264 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1265 foreach(uint i, Digit d; m.digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1266 if (d == 0) continue; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1267 // writeln("mul(n, m[i]) = ", mul(n, m[i])); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1268 // writeln("pow10(mul(n, m[i]), i) = ", pow10(mul(n, m[i]), i)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1269 p = simpleAdd(p, pow10(mul(n, m[i]), i)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1270 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1271 p.sign = a.sign ^ b.sign; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1272 return p; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1273 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1274 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1275 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1276 write("mul..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1277 Bcd a, b, p; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1278 a = 2105, b = 301; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1279 p = multiply(a, b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1280 assert(p == Bcd(633605)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1281 b = 800, a = 23958233; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1282 p = multiply(a, b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1283 assert(p == Bcd("19166586400")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1284 b = 5830, a = 23958233; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1285 p = multiply(a, b); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1286 assert(p == Bcd("139676498390")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1287 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1288 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1289 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1290 private Bcd mul(const Bcd a, Digit m) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1291 Bcd p = Bcd(0, a.numDigits+1); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1292 Digit c = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1293 int i = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1294 foreach (Digit d; a.digits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1295 p[i] = mul(m, d, c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1296 i++; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1297 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1298 if (c) p[i] = c; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1299 return p; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1300 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1301 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1302 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1303 write("mul..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1304 Bcd a, p; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1305 Digit m; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1306 a = 2105, m = 3; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1307 p = mul(a, m); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1308 assert(p == Bcd(6315)); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1309 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1310 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1311 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1312 private Digit mul(Digit a, Digit b, ref Digit c) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1313 Digit p = a * b + c; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1314 c = p / 10; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1315 return p % 10; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1316 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1317 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1318 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1319 write("mul..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1320 Digit a, b, c, d; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1321 a = 2, b = 3, c = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1322 d = mul(a,b,c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1323 assert(d == 6); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1324 assert(c == 0); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1325 a = 9, b = 8, c = 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1326 d = mul(a,b,c); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1327 assert(d == 2); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1328 assert(c == 7); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1329 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1330 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1331 |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1332 public Bcd divide(const Bcd a, const Bcd b, out Bcd r) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1333 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1334 if (b == ZERO) throw new Exception("Divide by zero"); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1335 if (a == ZERO) return ZERO.dup; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1336 |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1337 Bcd d = canonical(abs(b)); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1338 r = canonical(abs(a)); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1339 Bcd q; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1340 Bcd p = d; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1341 Bcd m; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1342 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1343 // shift the divisor |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1344 do { |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1345 m = p; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1346 p <<= 1; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1347 } while (p <= r && p > m); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1348 |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1349 while (m >= d) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1350 q <<= 1; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1351 // subtract repeatedly |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1352 while (m <= r) { |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1353 r -= m; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1354 q++; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1355 } |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1356 m >>= 1; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1357 } |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1358 |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1359 // adjust the sign |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1360 r.sign = a.sign; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1361 q.sign = a.sign != b.sign; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1362 return q; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1363 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1364 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1365 unittest { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1366 write("divide..."); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1367 Bcd a, b, q, r; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1368 a = 144; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1369 b = 12; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1370 q = divide(a, b, r); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1371 assert(q == 12); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1372 assert(r == 0); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1373 a = 144; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1374 b = 14; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1375 q = divide(a, b, r); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1376 assert(q == 10); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1377 assert(r == 4); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1378 a = 142351; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1379 b = 12; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1380 q = divide(a, b, r); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1381 // writeln("q = ", q); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1382 // writeln("r = ", r); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1383 assert(q == 11862); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1384 assert(r == 7); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1385 a = 2; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1386 b = 12; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1387 q = divide(a, b, r); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1388 assert(q == 0); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1389 assert(r == 2); |
7
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1390 a = 7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1391 b = 3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1392 q = divide(a, b, r); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1393 assert(q == 2); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1394 assert(r == 1); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1395 a = 7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1396 b = -3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1397 q = divide(a, b, r); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1398 assert(q == -2); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1399 assert(r == 1); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1400 a = -7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1401 b = 3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1402 q = divide(a, b, r); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1403 assert(q == -2); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1404 assert(r == -1); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1405 a = -7; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1406 b = -3; |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1407 q = divide(a, b, r); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1408 assert(q == 2); |
b304232c476c
Coded and tested div and mod. Changed setNumDigits.
Paul (paul.d.anderson@comcast.net)
parents:
6
diff
changeset
|
1409 assert(r == -1); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1410 writeln("passed"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1411 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1412 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1413 |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1414 public Bcd truncate(const Bcd a, int n) { |
10 | 1415 return truncate(a, n, Bcd()); |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1416 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1417 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1418 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1419 write("truncate...."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1420 Bcd a; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1421 a = 1234567; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1422 assert(truncate(a,3) == 123); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1423 a = 10256; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1424 assert(truncate(a,5) == 10256); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1425 a = 8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1426 assert(truncate(a,1) == 8); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1427 a = -8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1428 assert(truncate(a,1) == -8); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1429 a = -8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1430 assert(truncate(a,-1) == 0); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1431 writeln("passed"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1432 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1433 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1434 /** |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1435 * Truncate to the specified number of digits |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1436 */ |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1437 public Bcd truncate(const Bcd a, int n, out Bcd r) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1438 if (n <= 0) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1439 r = canonical(a); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1440 return ZERO.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1441 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1442 if (n >= a.numDigits) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1443 r = ZERO.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1444 return canonical(a); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1445 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1446 Bcd b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1447 b.digits = a.digits[$-n..$].dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1448 b.sign = a.sign; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1449 r.digits = a.digits[0..$-n].dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1450 return b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1451 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1452 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1453 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1454 write("truncRem..."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1455 Bcd a; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1456 Bcd r; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1457 a = 1234567; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1458 assert(truncate(a, 3, r) == 123); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1459 assert(r == 4567); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1460 a = 10256; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1461 assert(truncate(a,5,r) == 10256); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1462 assert(r == 0); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1463 a = 8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1464 assert(truncate(a,1,r) == 8); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1465 assert(r == 500); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1466 a = -8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1467 assert(truncate(a,1,r) == -8); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1468 assert(r == 500); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1469 a = -8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1470 // writeln("truncate(a, 6, r) = ", truncate(a, 6, r)); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1471 // writeln("r = ", r); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1472 assert(truncate(a,6,r) == -8500); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1473 assert(r == 0); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1474 writeln("passed"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1475 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1476 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1477 public Bcd pad(Bcd a, int n) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1478 if (n <= a.numDigits) return a.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1479 return Bcd(a,n); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1480 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1481 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1482 unittest { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1483 write("pad........."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1484 Bcd a; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1485 a = 1234567; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1486 assert(pad(a,3) == 1234567); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1487 a = 10256; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1488 // writeln("pad(a,9) = ", pad(a,9)); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1489 assert(pad(a,9).toString == "000010256"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1490 a = 8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1491 assert(pad(a,6).toString == "008500"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1492 a = -8500; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1493 assert(pad(a,6).toString == "-008500"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1494 writeln("passed"); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1495 } |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1496 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1497 public Bcd pow10(const Bcd a, uint n) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1498 Bcd b = canonical(a); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1499 if (n == 0 || b == 0) return b; |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1500 Digit[] zeros = new Digit[n]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1501 b.digits = zeros ~ b.digits; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1502 return b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1503 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1504 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1505 public Bcd pow10(uint n) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1506 return pow10(ONE, n); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1507 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1508 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1509 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1510 write("pow10..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1511 Bcd a, b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1512 a = 21345; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1513 a = pow10(a, 12); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1514 assert(a == Bcd("21345000000000000")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1515 a = pow10(a, 0); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1516 assert(a == "21345000000000000"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1517 a = pow10(9); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1518 assert(a == Bcd("1000000000")); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1519 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1520 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1521 |
10 | 1522 public Bcd power(const Bcd a, uint n) { |
1523 Bcd b = canonical(a); | |
1524 Bcd p = ONE.dup; | |
1525 while (n > 0) { | |
1526 if (n & 1) { | |
1527 p *= b; | |
1528 if (n == 1) return p; | |
1529 } | |
1530 b *= b; | |
1531 n /= 2; | |
1532 } | |
1533 return p; | |
1534 } | |
1535 | |
1536 unittest { | |
1537 write("power......."); | |
1538 Bcd a; | |
1539 a = 2; | |
1540 int n = 3; | |
1541 assert(power(a,n) == 8); | |
1542 writeln("passed"); | |
1543 } | |
1544 | |
1545 | |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1546 public Bcd shift(const Bcd a, int n) { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1547 if (n == 0) return canonical(a); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1548 if (n > 0) { // shift left |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1549 return pow10(a, n); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1550 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1551 else { // shift right |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1552 if (-n >= a.numDigits) return ZERO.dup; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1553 return truncate(a, a.numDigits + n); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1554 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1555 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1556 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1557 unittest { |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1558 write("shift......."); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1559 Bcd a, b; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1560 a = 1234; |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1561 b = shift(a, 1); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1562 assert(b.toString == "12340"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1563 b = shift(a, 2); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1564 assert(b.toString == "123400"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1565 b = shift(a, -1); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1566 // writeln("b = ", b); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1567 assert(b.toString == "123"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1568 b = shift(a, 0); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1569 assert(b.toString == "1234"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1570 b = shift(a, -12); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1571 /+ writeln("b = ", b);+/ |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1572 assert(b.toString == "0"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1573 b = shift(a, -4); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1574 assert(b.toString == "0"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1575 writeln("passed"); |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1576 } |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1577 |
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1578 public Bcd shiftFixed(const Bcd a, int n) { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1579 if (n == 0) return a.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1580 Bcd b = Bcd(0, a.numDigits); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1581 if (std.math.abs(n) >= a.numDigits) return b; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1582 if (n > 0) { // shiftFixed left |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1583 b.digits[0..$-n] = a.digits[n..$]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1584 } |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1585 else { // shiftFixed right |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1586 n = -n; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1587 b.digits[n..$] = a.digits[0..$-n]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1588 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1589 return b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1590 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1591 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1592 unittest { |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1593 write("shiftFixed..."); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1594 Bcd a, b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1595 a = 1234; |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1596 b = shiftFixed(a, 1); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1597 assert(b.toString == "0123"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1598 b = shiftFixed(a, 2); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1599 assert(b.toString == "0012"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1600 b = shiftFixed(a, -1); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1601 assert(b.toString == "2340"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1602 b = shiftFixed(a, 0); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1603 assert(b.toString == "1234"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1604 b = shiftFixed(a, 12); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1605 assert(b.toString == "0000"); |
6
14badf9104b9
shifts, rotations, division
Paul (paul.d.anderson@comcast.net)
parents:
5
diff
changeset
|
1606 b = shiftFixed(a, -4); |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1607 assert(b.toString == "0000"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1608 writeln("passed"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1609 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1610 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1611 public Bcd rotate(const Bcd a, int n) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1612 if (n == 0) return a.dup; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1613 Bcd b = Bcd(0, a.numDigits); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1614 if (std.math.abs(n) >= a.numDigits) { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1615 bool sign = n < 0; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1616 n = std.math.abs(n) % a.numDigits; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1617 if (sign) n = -n; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1618 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1619 if (n > 0) { // rotate left |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1620 b.digits[0..$-n] = a.digits[n..$]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1621 b.digits[$-n..$] = a.digits[0..n]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1622 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1623 else { // rotate right |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1624 n = -n; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1625 b.digits[n..$] = a.digits[0..$-n]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1626 b.digits[0..n] = a.digits[$-n..$]; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1627 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1628 return b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1629 } |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1630 |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1631 unittest { |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1632 write("rotate..."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1633 Bcd a, b; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1634 a = 1234; |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1635 b = rotate(a, 1); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1636 assert(b.toString == "4123"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1637 b = rotate(a, 2); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1638 assert(b.toString == "3412"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1639 b = rotate(a, -1); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1640 assert(b.toString == "2341"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1641 b = rotate(a, 0); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1642 assert(b.toString == "1234"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1643 b = rotate(a, 12); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1644 assert(b.toString == "1234"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1645 b = rotate(a, -4); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1646 assert(b.toString == "1234"); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1647 writeln("passed"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1648 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1649 |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1650 /** |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1651 * Rounds the specified integer to the specified number of digits. |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1652 * The rounding mode governs the method of rounding. |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1653 */ |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1654 public Bcd round(const Bcd a, int n, Rounding mode) { |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1655 Bcd r; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1656 Bcd b = truncate(a, n, r); |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1657 return round(b, r, mode); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1658 // return b; |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1659 } |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1660 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1661 /** |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1662 * Rounds the (truncated) integer based on its remainder and the rounding |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1663 * mode. |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1664 */ |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1665 public Bcd round(const Bcd a, const Bcd r, const Rounding mode) { |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1666 Bcd b = canonical(a); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1667 ubyte rfd = r.firstDigit; |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1668 switch (mode) { |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1669 case Rounding.DOWN: |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1670 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1671 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1672 case Rounding.HALF_UP: |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1673 if (rfd >= 5) b++; |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1674 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1675 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1676 case Rounding.HALF_EVEN: |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1677 if (rfd < 5) return b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1678 if (rfd > 5) return ++b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1679 Bcd p = r.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1680 stripr(p); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1681 if (p.numDigits > 1) return ++b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1682 // to reach this point the remainder must be exactly 5 |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1683 // if odd, increment |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1684 if (b.lastDigit & 1 != 0) b++; |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1685 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1686 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1687 case Rounding.CEILING: |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1688 if (!b.isSigned && !r.isZero) b++; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1689 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1690 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1691 case Rounding.FLOOR: |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1692 if (b.isSigned && !r.isZero) b++; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1693 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1694 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1695 case Rounding.HALF_DOWN: |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1696 if (rfd < 5) return b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1697 if (rfd > 5) return ++b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1698 Bcd p = r.dup; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1699 stripr(p); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1700 if (p.numDigits > 1) return ++b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1701 // to reach this point the remainder must be exactly 5 |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1702 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1703 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1704 case Rounding.UP: |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1705 if (!r.isZero) b++; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1706 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1707 } |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1708 return b; |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1709 } |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1710 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1711 unittest { |
9
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1712 write("rounding...."); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1713 Bcd a, b; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1714 a = 12345; |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1715 b = round(a, 4, Rounding.DOWN); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1716 assert(b == 1234); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1717 b = round(a, 4, Rounding.HALF_UP); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1718 assert(b == 1235); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1719 b = round(a, 4, Rounding.CEILING); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1720 assert(b == 1235); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1721 b = round(a, 4, Rounding.HALF_EVEN); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1722 assert(b == 1234); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1723 b = round(a, 4, Rounding.FLOOR); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1724 assert(b == 1234); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1725 b = round(a, 4, Rounding.HALF_DOWN); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1726 assert(b == 1234); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1727 b = round(a, 4, Rounding.UP); |
48d564218e05
Added rounding, additional unit tests, strip leading and trailing zeros.
Paul (paul.d.anderson@comcast.net)
parents:
8
diff
changeset
|
1728 assert(b == 1235); |
8
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1729 writeln("passed"); |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1730 } |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1731 |
c991b9fde45c
added rounding (partially implemented)
Paul (paul.d.anderson@comcast.net)
parents:
7
diff
changeset
|
1732 |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1733 //========================================== |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1734 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1735 public void main() { |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1736 writeln(); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1737 writeln("If you got this far all the unit tests were successful."); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1738 writeln(); |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1739 writeln(" Congratulations!"); |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1740 Bcd bcd; |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1741 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1742 bcd = parse("12"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1743 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1744 bcd = parse("012"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1745 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1746 bcd = parse("-012"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1747 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1748 bcd = parse("+012"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1749 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1750 bcd = parse("-0"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1751 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1752 bcd = parse("012_345_678"); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1753 writeln("bcd = ", format(bcd)); |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1754 |
5
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1755 /+ |
c021ed211f89
bcd add, sub, multiply, logic and shift operations
Paul (paul.d.anderson@comcast.net)
parents:
4
diff
changeset
|
1756 writeln("OK!");+/ |
4
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1757 } |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1758 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1759 |
b37c218c1442
Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff
changeset
|
1760 |