convertBinaryToRational static method
Rational?
convertBinaryToRational(
- 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());
}