rescaleBinaryFixedPoint function

BinaryFixedPoint rescaleBinaryFixedPoint(
  1. BinaryFixedPoint value,
  2. int newTotalBits,
  3. int newFractionalBits, [
  4. FixedPointRoundingMode rounding = FixedPointRoundingMode.strict,
])

Rescales value to newTotalBits and newFractionalBits.

Implementation

BinaryFixedPoint rescaleBinaryFixedPoint(
  BinaryFixedPoint value,
  int newTotalBits,
  int newFractionalBits, [
  FixedPointRoundingMode rounding = FixedPointRoundingMode.strict,
]) {
  if (newFractionalBits < 0) {
    throw RangeError.range(newFractionalBits, 0, null, 'newFractionalBits');
  }
  if (value.totalBits == newTotalBits &&
      value.fractionalBits == newFractionalBits) {
    return value;
  }

  final raw = switch (newFractionalBits.compareTo(value.fractionalBits)) {
    0 => value.raw,
    1 => value.raw << (newFractionalBits - value.fractionalBits),
    _ => _divideWithRounding(
      value.raw,
      BigInt.one << (value.fractionalBits - newFractionalBits),
      rounding,
    ),
  };

  return rawBinaryFixedPoint(value.signedness, newTotalBits, newFractionalBits)(
    raw,
  );
}