convertBinaryToRational static method

Rational? convertBinaryToRational(
  1. BsonBinary binary
)

Implementation

static Rational? convertBinaryToRational(BsonBinary binary) {
  Int64 high, low;
  binary.rewind();
  low = binary.readFixInt64();
  high = binary.readFixInt64();

  /// The Rational class does not support a NaN field
  /// Return a null value
  if ((high & naNMask) == naNMask) {
    return null;
  }

  var isNegative = (high & signMask) == signMask;

  /// The rational class does not manage infinite value
  /// return a very high values
  if ((high & infinityMask) == infinityMask) {
    if (isNegative) {
      return -infinityValue;
    }
    return infinityValue;
  }

  var isFiniteCase2 = (high & finite2Mask) == finite2Mask;

  Int32 exponent;
  Rational significand, highSignificand;

  significand = Rational.parse(low.toRadixString(10));
  // Unfortunately we have only an Int64 and not an UInt64
  if (low.isNegative) {
    significand += maxUInt64;
  }
  if (isFiniteCase2) {
    exponent = ((high & exponent2Mask) >> 47).toInt32();
    highSignificand = Rational.parse(
        ((high & significand2Mask) | significand2impliedMask)
            .toRadixString(10));
  } else {
    exponent = ((high & exponent1Mask) >> 49).toInt32();
    highSignificand =
        Rational.parse((high & significand1Mask).toRadixString(10));
  }
  if (exponent > maxExponent) {
    return Rational.zero;
  }
  exponent = (exponent - 6176) as Int32;

  significand += highSignificand * maxUInt64;
  if (significand > maxSignificand) {
    significand = Rational.zero;
  }
  if (isNegative) {
    significand = -significand;
  }

  return significand * _r10.power(exponent.toInt());
}