Rational constructor
Create a new rational number from its numerator
and a non-zero
denominator
.
If the denominator
is omitted then its value will be 1
.
Implementation
factory Rational(BigInt numerator, [BigInt? denominator]) {
if (denominator == null) return Rational._fromCanonicalForm(numerator, _i1);
if (denominator == _i0) {
throw ArgumentError('zero can not be used as denominator');
}
if (numerator == _i0) return Rational._fromCanonicalForm(_i0, _i1);
if (denominator < _i0) {
numerator = -numerator;
denominator = -denominator;
}
// TODO(a14n): switch back when https://github.com/dart-lang/sdk/issues/46180 is fixed
// final gcd = numerator.abs().gcd(denominator.abs());
final gcd = _gcd(numerator.abs(), denominator.abs());
return Rational._fromCanonicalForm(numerator ~/ gcd, denominator ~/ gcd);
}