compareTo method

  1. @override
int compareTo(
  1. 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;
}