Skip to content

Commit

Permalink
Fix zero cases, re #4
Browse files Browse the repository at this point in the history
  • Loading branch information
safris committed Jun 6, 2020
1 parent d90a478 commit ac3b243
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions src/main/java/org/libj/math/LongDecimal.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,8 @@ public static long decodeValue(final long encoded, final byte bits) {
return encoded;

final long scaleMask = mask(bits);
// System.out.println("Smask: " + Buffers.toString(scaleMask));
// System.out.println("encoded: " + Buffers.toString(encoded));
// System.out.println("sleMask: " + Buffers.toString(scaleMask));
return encoded < 0 ? encoded | scaleMask : encoded & ~scaleMask;
}

Expand Down Expand Up @@ -223,7 +224,7 @@ public static long neg(final long d, final byte bits) {
* @see #decodeScale(long,byte)
*/
public static long sub(final long ld1, final long ld2, final byte bits, final long defaultValue) {
return add(ld1, ld2, -decodeValue(ld2, bits), decodeScale(ld2, bits), bits, defaultValue);
return ld1 == 0 ? neg(ld2, bits) : ld2 == 0 ? ld1 : add0(ld1, neg(ld2, bits), bits, defaultValue);
}

/**
Expand All @@ -249,14 +250,22 @@ public static long sub(final long ld1, final long ld2, final byte bits, final lo
* @see #decodeScale(long,byte)
*/
public static long add(final long ld1, final long ld2, final byte bits, final long defaultValue) {
return add(ld1, ld2, decodeValue(ld2, bits), decodeScale(ld2, bits), bits, defaultValue);
return ld1 == 0 ? ld2 : ld2 == 0 ? ld1 : add0(ld1, ld2, bits, defaultValue);
}

private static long add(long ld1, long ld2, long v2, short s2, final byte bits, final long defaultValue) {
private static long add0(long ld1, long ld2, final byte bits, final long defaultValue) {
long v1 = decodeValue(ld1, bits);
if (v1 == 0)
return ld2;

long v2 = decodeValue(ld2, bits);
if (v2 == 0)
return ld1;

final long maxValue = LongDecimal.maxValue[bits];
final long minValue = LongDecimal.minValue[bits];
long v1 = decodeValue(ld1, bits);
short s1 = decodeScale(ld1, bits);
short s2 = decodeScale(ld2, bits);
short s = 0;
if (s1 == s2) {
s = s1;
Expand All @@ -283,7 +292,7 @@ private static long add(long ld1, long ld2, long v2, short s2, final byte bits,
if (v1 > 0 ? 0 > test || test > maxValue : 0 < test || test < minValue)
--avail;

if (diff >= Numbers.digits(v2))
if (diff > Numbers.digits(maxValue))
return ld1;

if (diff > avail) {
Expand Down

0 comments on commit ac3b243

Please sign in to comment.