|
|
@@ -28,152 +28,138 @@ import java.util.List; |
|
|
|
*/ |
|
|
|
final class NumberComparisonExamples { |
|
|
|
|
|
|
|
private NumberComparisonExamples() { |
|
|
|
// no instances of this class |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* represents one comparison test case |
|
|
|
*/ |
|
|
|
public static final class ComparisonExample { |
|
|
|
private final long _rawBitsA; |
|
|
|
private final long _rawBitsB; |
|
|
|
private final int _expectedResult; |
|
|
|
|
|
|
|
public ComparisonExample(long rawBitsA, long rawBitsB, int expectedResult) { |
|
|
|
_rawBitsA = rawBitsA; |
|
|
|
_rawBitsB = rawBitsB; |
|
|
|
_expectedResult = expectedResult; |
|
|
|
} |
|
|
|
|
|
|
|
public double getA() { |
|
|
|
return Double.longBitsToDouble(_rawBitsA); |
|
|
|
} |
|
|
|
public double getB() { |
|
|
|
return Double.longBitsToDouble(_rawBitsB); |
|
|
|
} |
|
|
|
public double getNegA() { |
|
|
|
return -Double.longBitsToDouble(_rawBitsA); |
|
|
|
} |
|
|
|
public double getNegB() { |
|
|
|
return -Double.longBitsToDouble(_rawBitsB); |
|
|
|
} |
|
|
|
public int getExpectedResult() { |
|
|
|
return _expectedResult; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static final ComparisonExample[] examples = initExamples(); |
|
|
|
|
|
|
|
private static ComparisonExample[] initExamples() { |
|
|
|
|
|
|
|
List<ComparisonExample> temp = new ArrayList<>(); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x4010000000000005L); |
|
|
|
addStepTransition(temp, 0x4010000000000010L); |
|
|
|
addStepTransition(temp, 0x401000000000001CL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x403CE0FFFFFFFFF1L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x5010000000000006L); |
|
|
|
addStepTransition(temp, 0x5010000000000010L); |
|
|
|
addStepTransition(temp, 0x501000000000001AL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x544CE6345CF32018L); |
|
|
|
addStepTransition(temp, 0x544CE6345CF3205AL); |
|
|
|
addStepTransition(temp, 0x544CE6345CF3209CL); |
|
|
|
addStepTransition(temp, 0x544CE6345CF320DEL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x54B250001000101DL); |
|
|
|
addStepTransition(temp, 0x54B2500010001050L); |
|
|
|
addStepTransition(temp, 0x54B2500010001083L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x6230100010001000L); |
|
|
|
addStepTransition(temp, 0x6230100010001005L); |
|
|
|
addStepTransition(temp, 0x623010001000100AL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x7F50300020001011L); |
|
|
|
addStepTransition(temp, 0x7F5030002000102BL); |
|
|
|
addStepTransition(temp, 0x7F50300020001044L); |
|
|
|
|
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B2BFFFF1000102AL); |
|
|
|
addStepTransition(temp, 0x2B2BFFFF10001079L); |
|
|
|
addStepTransition(temp, 0x2B2BFFFF100010C8L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B2BFF001000102DL); |
|
|
|
addStepTransition(temp, 0x2B2BFF0010001035L); |
|
|
|
addStepTransition(temp, 0x2B2BFF001000103DL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B61800040002024L); |
|
|
|
addStepTransition(temp, 0x2B61800040002055L); |
|
|
|
addStepTransition(temp, 0x2B61800040002086L); |
|
|
|
|
|
|
|
|
|
|
|
addStepTransition(temp, 0x008000000000000BL); |
|
|
|
// just outside 'subnormal' range |
|
|
|
addStepTransition(temp, 0x0010000000000007L); |
|
|
|
addStepTransition(temp, 0x001000000000001BL); |
|
|
|
addStepTransition(temp, 0x001000000000002FL); |
|
|
|
|
|
|
|
Collections.addAll(temp, new ComparisonExample[]{ |
|
|
|
// negative, and exponents differ by more than 1 |
|
|
|
ce(0xBF30000000000000L, 0xBE60000000000000L, -1), |
|
|
|
|
|
|
|
// negative zero *is* less than positive zero, but not easy to get out of calculations |
|
|
|
ce(0x0000000000000000L, 0x8000000000000000L, +1), |
|
|
|
// subnormal numbers compare without rounding for some reason |
|
|
|
ce(0x0000000000000000L, 0x0000000000000001L, -1), |
|
|
|
ce(0x0008000000000000L, 0x0008000000000001L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFFL, 0x000FFFFFFFFFFFFEL, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x000FFFFFFFFFFFFCL, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x000FFFFFFFFFFFFEL, -1), |
|
|
|
|
|
|
|
// across subnormal threshold (some mistakes when close) |
|
|
|
ce(0x000FFFFFFFFFFFFFL, 0x0010000000000000L, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x0010000000000007L, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFAL, 0x0010000000000007L, 0), |
|
|
|
|
|
|
|
// when a bit further apart - normal results |
|
|
|
ce(0x000FFFFFFFFFFFF9L, 0x0010000000000007L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFAL, 0x0010000000000008L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x0010000000000008L, -1), |
|
|
|
}); |
|
|
|
|
|
|
|
ComparisonExample[] result = new ComparisonExample[temp.size()]; |
|
|
|
temp.toArray(result); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
private static ComparisonExample ce(long rawBitsA, long rawBitsB, int expectedResult) { |
|
|
|
return new ComparisonExample(rawBitsA, rawBitsB, expectedResult); |
|
|
|
} |
|
|
|
|
|
|
|
private static void addStepTransition(List<ComparisonExample> temp, long rawBits) { |
|
|
|
Collections.addAll(temp, new ComparisonExample[]{ |
|
|
|
ce(rawBits - 1, rawBits + 0, 0), |
|
|
|
ce(rawBits + 0, rawBits + 1, -1), |
|
|
|
ce(rawBits + 1, rawBits + 2, 0), |
|
|
|
}); |
|
|
|
|
|
|
|
} |
|
|
|
private NumberComparisonExamples() { |
|
|
|
// no instances of this class |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* represents one comparison test case |
|
|
|
*/ |
|
|
|
public static final class ComparisonExample { |
|
|
|
private final long _rawBitsA; |
|
|
|
private final long _rawBitsB; |
|
|
|
private final int _expectedResult; |
|
|
|
|
|
|
|
public ComparisonExample(long rawBitsA, long rawBitsB, int expectedResult) { |
|
|
|
_rawBitsA = rawBitsA; |
|
|
|
_rawBitsB = rawBitsB; |
|
|
|
_expectedResult = expectedResult; |
|
|
|
} |
|
|
|
|
|
|
|
public double getA() { |
|
|
|
return Double.longBitsToDouble(_rawBitsA); |
|
|
|
} |
|
|
|
public double getB() { |
|
|
|
return Double.longBitsToDouble(_rawBitsB); |
|
|
|
} |
|
|
|
public double getNegA() { |
|
|
|
return -Double.longBitsToDouble(_rawBitsA); |
|
|
|
} |
|
|
|
public double getNegB() { |
|
|
|
return -Double.longBitsToDouble(_rawBitsB); |
|
|
|
} |
|
|
|
public int getExpectedResult() { |
|
|
|
return _expectedResult; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static final ComparisonExample[] examples = initExamples(); |
|
|
|
|
|
|
|
private static ComparisonExample[] initExamples() { |
|
|
|
|
|
|
|
List<ComparisonExample> temp = new ArrayList<>(); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x4010000000000005L); |
|
|
|
addStepTransition(temp, 0x4010000000000010L); |
|
|
|
addStepTransition(temp, 0x401000000000001CL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x403CE0FFFFFFFFF1L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x5010000000000006L); |
|
|
|
addStepTransition(temp, 0x5010000000000010L); |
|
|
|
addStepTransition(temp, 0x501000000000001AL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x544CE6345CF32018L); |
|
|
|
addStepTransition(temp, 0x544CE6345CF3205AL); |
|
|
|
addStepTransition(temp, 0x544CE6345CF3209CL); |
|
|
|
addStepTransition(temp, 0x544CE6345CF320DEL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x54B250001000101DL); |
|
|
|
addStepTransition(temp, 0x54B2500010001050L); |
|
|
|
addStepTransition(temp, 0x54B2500010001083L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x6230100010001000L); |
|
|
|
addStepTransition(temp, 0x6230100010001005L); |
|
|
|
addStepTransition(temp, 0x623010001000100AL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x7F50300020001011L); |
|
|
|
addStepTransition(temp, 0x7F5030002000102BL); |
|
|
|
addStepTransition(temp, 0x7F50300020001044L); |
|
|
|
|
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B2BFFFF1000102AL); |
|
|
|
addStepTransition(temp, 0x2B2BFFFF10001079L); |
|
|
|
addStepTransition(temp, 0x2B2BFFFF100010C8L); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B2BFF001000102DL); |
|
|
|
addStepTransition(temp, 0x2B2BFF0010001035L); |
|
|
|
addStepTransition(temp, 0x2B2BFF001000103DL); |
|
|
|
|
|
|
|
addStepTransition(temp, 0x2B61800040002024L); |
|
|
|
addStepTransition(temp, 0x2B61800040002055L); |
|
|
|
addStepTransition(temp, 0x2B61800040002086L); |
|
|
|
|
|
|
|
|
|
|
|
addStepTransition(temp, 0x008000000000000BL); |
|
|
|
// just outside 'subnormal' range |
|
|
|
addStepTransition(temp, 0x0010000000000007L); |
|
|
|
addStepTransition(temp, 0x001000000000001BL); |
|
|
|
addStepTransition(temp, 0x001000000000002FL); |
|
|
|
|
|
|
|
Collections.addAll(temp, new ComparisonExample[]{ |
|
|
|
// negative, and exponents differ by more than 1 |
|
|
|
ce(0xBF30000000000000L, 0xBE60000000000000L, -1), |
|
|
|
|
|
|
|
// negative zero *is* less than positive zero, but not easy to get out of calculations |
|
|
|
ce(0x0000000000000000L, 0x8000000000000000L, +1), |
|
|
|
// subnormal numbers compare without rounding for some reason |
|
|
|
ce(0x0000000000000000L, 0x0000000000000001L, -1), |
|
|
|
ce(0x0008000000000000L, 0x0008000000000001L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFFL, 0x000FFFFFFFFFFFFEL, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x000FFFFFFFFFFFFCL, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x000FFFFFFFFFFFFEL, -1), |
|
|
|
|
|
|
|
// across subnormal threshold (some mistakes when close) |
|
|
|
ce(0x000FFFFFFFFFFFFFL, 0x0010000000000000L, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x0010000000000007L, +1), |
|
|
|
ce(0x000FFFFFFFFFFFFAL, 0x0010000000000007L, 0), |
|
|
|
|
|
|
|
// when a bit further apart - normal results |
|
|
|
ce(0x000FFFFFFFFFFFF9L, 0x0010000000000007L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFAL, 0x0010000000000008L, -1), |
|
|
|
ce(0x000FFFFFFFFFFFFBL, 0x0010000000000008L, -1), |
|
|
|
}); |
|
|
|
|
|
|
|
ComparisonExample[] result = new ComparisonExample[temp.size()]; |
|
|
|
temp.toArray(result); |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
private static ComparisonExample ce(long rawBitsA, long rawBitsB, int expectedResult) { |
|
|
|
return new ComparisonExample(rawBitsA, rawBitsB, expectedResult); |
|
|
|
} |
|
|
|
|
|
|
|
private static void addStepTransition(List<ComparisonExample> temp, long rawBits) { |
|
|
|
Collections.addAll(temp, new ComparisonExample[]{ |
|
|
|
ce(rawBits - 1, rawBits + 0, 0), |
|
|
|
ce(rawBits + 0, rawBits + 1, -1), |
|
|
|
ce(rawBits + 1, rawBits + 2, 0), |
|
|
|
}); |
|
|
|
|
|
|
|
public static ComparisonExample[] getComparisonExamples() { |
|
|
|
return examples.clone(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public static ComparisonExample[] getComparisonExamples2() { |
|
|
|
ComparisonExample[] result = examples.clone(); |
|
|
|
public static ComparisonExample[] getComparisonExamples() { |
|
|
|
return examples.clone(); |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0; i < result.length; i++) { |
|
|
|
int ha = ("a"+i).hashCode(); |
|
|
|
double a = ha * Math.pow(0.75, ha % 100); |
|
|
|
int hb = ("b"+i).hashCode(); |
|
|
|
double b = hb * Math.pow(0.75, hb % 100); |
|
|
|
|
|
|
|
result[i] = new ComparisonExample(Double.doubleToLongBits(a), Double.doubleToLongBits(b), Double.compare(a, b)); |
|
|
|
} |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
} |