compareTo method
- Object other
override
Compares two ordered values to implement Comparable.
Throws if either operand is NaN because IEEE 754 ordinary comparisons define NaNs as unordered.
Implementation
@override
int compareTo(Object other) {
final comparable = _validateComparable(other);
if (isNaN || comparable.isNaN) {
throw RohdHclException('NaN values are unordered.');
}
// IEEE 754: -0 an +0 are considered equal
if ((exponent.isZero && mantissa.isZero) &&
(comparable.exponent.isZero && comparable.mantissa.isZero)) {
return 0;
}
final signCompare = -sign.compareTo(comparable.sign);
final canonical = canonicalize();
final otherCanonical = comparable.canonicalize();
final canonicalMantissa = canonical.explicitJBit
? canonical.mantissa.getRange(0, -1)
: canonical.mantissa;
final otherCanonicalMantissa = otherCanonical.explicitJBit
? otherCanonical.mantissa.getRange(0, -1)
: otherCanonical.mantissa;
final expCompare = canonical.exponent.compareTo(otherCanonical.exponent);
final mantCompare = canonicalMantissa.compareTo(otherCanonicalMantissa);
if ((signCompare != 0) &&
!(exponent.isZero &&
mantissa.isZero &&
comparable.exponent.isZero &&
comparable.mantissa.isZero)) {
return signCompare; // IEEE 754: -0 and +0 are considered equal.
}
if (expCompare != 0) {
return sign.isZero ? expCompare : -expCompare;
} else if (mantCompare != 0) {
return sign.isZero ? mantCompare : -mantCompare;
}
return 0;
}