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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
47 /+static this() {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
48 immutable(Bcd) MAX_LONG = cast(immutable) Bcd(long.max);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
49 // MAX_LONG = cast(immutable) Bcd(long.max);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
50 }+/
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
225 if (n == 0) n++;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
226 digits.length = n;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
227 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
228
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
229 /+ /**
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
230 * Adjusts the number of digits in this BCD integer,
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
231 * padding or truncating if necessary.
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
232 * If truncating, first leading zeros are stripped away, then
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
233 * the remainder is clipped.
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
234 */
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
243 }+/
4
b37c218c1442 Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
244
10
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
399 // casting operators.
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
400 //--------------------------------
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
401
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
402 const long opCast() {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
403 Bcd MAX_LONG = Bcd(long.max);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
404 Bcd MIN_LONG = Bcd(long.min);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
405
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
406 if (this > MAX_LONG || this < MIN_LONG)
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
407 throw new Exception("Can't cast -- out of range");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
408
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
409 long n = 0;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
410 foreach_reverse(Digit digit; digits) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
411 n = 10*n + digit;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
412 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
413 return this.sign ? -n : n;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
414 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
415
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
416 unittest {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
417 write("cast(long)...");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
418 Bcd a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
419 a = "12345678901234567890123456";
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
420 // long n = cast(long) a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
421 a = 12345678L;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
422 long n = cast(long) a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
423 assert(n == 12345678L);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
424 int m = cast(int) a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
425 assert(m == 12345678L);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
426 a = -a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
427 m = cast(int) a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
428 assert(m == -12345678L);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
429
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
430 writeln("passed");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
431 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
432
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
433
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
669 a = -100;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
670 b = 5;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
671 assert(a < b);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
672 a = -100;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
673 b = -5;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
674 assert(a < b);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
675 a = 100;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
676 b = -5;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
743
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
744 private void clipFirst(ref Bcd a, uint n = 1) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
745 if (n == 0) return;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
746 if (n >= a.digits.length) a = ZERO;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
747 else a.digits = a.digits[0..$-n];
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
748 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
749
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
750 private void clipLast(ref Bcd a, uint n = 1) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
751 if (n == 0) return;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
752 if (n >= a.digits.length) a = ZERO;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
753 else a.digits = a.digits[n..$];
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
754 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
755
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
756 unittest {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
757 write("clipping....");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
758 Bcd a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
759 a = 12345;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
760 clipFirst(a);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
761 assert(a == 2345);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
762 clipLast(a);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
763 assert(a == 234);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
764 a = 1234567890;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
765 clipFirst(a, 3);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
766 assert(a == 4567890);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
767 clipLast(a, 5);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
768 assert(a == 45);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
769 clipLast(a, 5);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
770 assert(a == 0);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
771 writeln("passed");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
772 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
773
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
921 if (!a.isSigned) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
922 if (a.digits.length > b.digits.length) return 1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
923 if (a.digits.length < b.digits.length) return -1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
924 foreach_reverse(int i, Digit digit; a.digits) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
925 if (digit > b.digits[i]) return 1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
926 if (digit < b.digits[i]) return -1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
927 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
928 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
929 else {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
930 if (a.digits.length > b.digits.length) return -1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
931 if (a.digits.length < b.digits.length) return 11;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
932 foreach_reverse(int i, Digit digit; a.digits) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
933 if (digit > b.digits[i]) return -1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
934 if (digit < b.digits[i]) return 1;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
973 // TODO: really? private?
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
999 public Bcd not(const Bcd a) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1000 Bcd b = a.dup;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1001 foreach(Digit digit; b.digits) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1002 digit = not(digit);
4
b37c218c1442 Initial development of BCD integers
Paul (paul.d.anderson@comcast.net)
parents:
diff changeset
1003 }
10
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1522 public Bcd power(const Bcd a, uint n) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1523 Bcd b = canonical(a);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1524 Bcd p = ONE.dup;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1525 while (n > 0) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1526 if (n & 1) {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1527 p *= b;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1528 if (n == 1) return p;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1529 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1530 b *= b;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1531 n /= 2;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1532 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1533 return p;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1534 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1535
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1536 unittest {
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1537 write("power.......");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1538 Bcd a;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1539 a = 2;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1540 int n = 3;
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1541 assert(power(a,n) == 8);
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1542 writeln("passed");
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1543 }
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
1544
f925fe996255 added cast, clip, power
Paul (paul.d.anderson@comcast.net)
parents: 9
diff changeset
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