class BigRational
An arbitrarily large rational number.
This class is immutable.
@psalm-immutable
Hierarchy
- class \Brick\Math\BigNumber implements \Brick\Math\JsonSerializable
- class \Brick\Math\BigRational extends \Brick\Math\BigNumber
Expanded class hierarchy of BigRational
File
-
vendor/
brick/ math/ src/ BigRational.php, line 19
Namespace
Brick\MathView source
final class BigRational extends BigNumber {
/**
* The numerator.
*/
private readonly BigInteger $numerator;
/**
* The denominator. Always strictly positive.
*/
private readonly BigInteger $denominator;
/**
* Protected constructor. Use a factory method to obtain an instance.
*
* @param BigInteger $numerator The numerator.
* @param BigInteger $denominator The denominator.
* @param bool $checkDenominator Whether to check the denominator for negative and zero.
*
* @throws DivisionByZeroException If the denominator is zero.
*/
protected function __construct(BigInteger $numerator, BigInteger $denominator, bool $checkDenominator) {
if ($checkDenominator) {
if ($denominator->isZero()) {
throw DivisionByZeroException::denominatorMustNotBeZero();
}
if ($denominator->isNegative()) {
$numerator = $numerator->negated();
$denominator = $denominator->negated();
}
}
$this->numerator = $numerator;
$this->denominator = $denominator;
}
/**
* @psalm-pure
*/
protected static function from(BigNumber $number) : static {
return $number->toBigRational();
}
/**
* Creates a BigRational out of a numerator and a denominator.
*
* If the denominator is negative, the signs of both the numerator and the denominator
* will be inverted to ensure that the denominator is always positive.
*
* @param BigNumber|int|float|string $numerator The numerator. Must be convertible to a BigInteger.
* @param BigNumber|int|float|string $denominator The denominator. Must be convertible to a BigInteger.
*
* @throws NumberFormatException If an argument does not represent a valid number.
* @throws RoundingNecessaryException If an argument represents a non-integer number.
* @throws DivisionByZeroException If the denominator is zero.
*
* @psalm-pure
*/
public static function nd(BigNumber|int|float|string $numerator, BigNumber|int|float|string $denominator) : BigRational {
$numerator = BigInteger::of($numerator);
$denominator = BigInteger::of($denominator);
return new BigRational($numerator, $denominator, true);
}
/**
* Returns a BigRational representing zero.
*
* @psalm-pure
*/
public static function zero() : BigRational {
/**
* @psalm-suppress ImpureStaticVariable
* @var BigRational|null $zero
*/
static $zero;
if ($zero === null) {
$zero = new BigRational(BigInteger::zero(), BigInteger::one(), false);
}
return $zero;
}
/**
* Returns a BigRational representing one.
*
* @psalm-pure
*/
public static function one() : BigRational {
/**
* @psalm-suppress ImpureStaticVariable
* @var BigRational|null $one
*/
static $one;
if ($one === null) {
$one = new BigRational(BigInteger::one(), BigInteger::one(), false);
}
return $one;
}
/**
* Returns a BigRational representing ten.
*
* @psalm-pure
*/
public static function ten() : BigRational {
/**
* @psalm-suppress ImpureStaticVariable
* @var BigRational|null $ten
*/
static $ten;
if ($ten === null) {
$ten = new BigRational(BigInteger::ten(), BigInteger::one(), false);
}
return $ten;
}
public function getNumerator() : BigInteger {
return $this->numerator;
}
public function getDenominator() : BigInteger {
return $this->denominator;
}
/**
* Returns the quotient of the division of the numerator by the denominator.
*/
public function quotient() : BigInteger {
return $this->numerator
->quotient($this->denominator);
}
/**
* Returns the remainder of the division of the numerator by the denominator.
*/
public function remainder() : BigInteger {
return $this->numerator
->remainder($this->denominator);
}
/**
* Returns the quotient and remainder of the division of the numerator by the denominator.
*
* @return BigInteger[]
*
* @psalm-return array{BigInteger, BigInteger}
*/
public function quotientAndRemainder() : array {
return $this->numerator
->quotientAndRemainder($this->denominator);
}
/**
* Returns the sum of this number and the given one.
*
* @param BigNumber|int|float|string $that The number to add.
*
* @throws MathException If the number is not valid.
*/
public function plus(BigNumber|int|float|string $that) : BigRational {
$that = BigRational::of($that);
$numerator = $this->numerator
->multipliedBy($that->denominator);
$numerator = $numerator->plus($that->numerator
->multipliedBy($this->denominator));
$denominator = $this->denominator
->multipliedBy($that->denominator);
return new BigRational($numerator, $denominator, false);
}
/**
* Returns the difference of this number and the given one.
*
* @param BigNumber|int|float|string $that The number to subtract.
*
* @throws MathException If the number is not valid.
*/
public function minus(BigNumber|int|float|string $that) : BigRational {
$that = BigRational::of($that);
$numerator = $this->numerator
->multipliedBy($that->denominator);
$numerator = $numerator->minus($that->numerator
->multipliedBy($this->denominator));
$denominator = $this->denominator
->multipliedBy($that->denominator);
return new BigRational($numerator, $denominator, false);
}
/**
* Returns the product of this number and the given one.
*
* @param BigNumber|int|float|string $that The multiplier.
*
* @throws MathException If the multiplier is not a valid number.
*/
public function multipliedBy(BigNumber|int|float|string $that) : BigRational {
$that = BigRational::of($that);
$numerator = $this->numerator
->multipliedBy($that->numerator);
$denominator = $this->denominator
->multipliedBy($that->denominator);
return new BigRational($numerator, $denominator, false);
}
/**
* Returns the result of the division of this number by the given one.
*
* @param BigNumber|int|float|string $that The divisor.
*
* @throws MathException If the divisor is not a valid number, or is zero.
*/
public function dividedBy(BigNumber|int|float|string $that) : BigRational {
$that = BigRational::of($that);
$numerator = $this->numerator
->multipliedBy($that->denominator);
$denominator = $this->denominator
->multipliedBy($that->numerator);
return new BigRational($numerator, $denominator, true);
}
/**
* Returns this number exponentiated to the given value.
*
* @throws \InvalidArgumentException If the exponent is not in the range 0 to 1,000,000.
*/
public function power(int $exponent) : BigRational {
if ($exponent === 0) {
$one = BigInteger::one();
return new BigRational($one, $one, false);
}
if ($exponent === 1) {
return $this;
}
return new BigRational($this->numerator
->power($exponent), $this->denominator
->power($exponent), false);
}
/**
* Returns the reciprocal of this BigRational.
*
* The reciprocal has the numerator and denominator swapped.
*
* @throws DivisionByZeroException If the numerator is zero.
*/
public function reciprocal() : BigRational {
return new BigRational($this->denominator, $this->numerator, true);
}
/**
* Returns the absolute value of this BigRational.
*/
public function abs() : BigRational {
return new BigRational($this->numerator
->abs(), $this->denominator, false);
}
/**
* Returns the negated value of this BigRational.
*/
public function negated() : BigRational {
return new BigRational($this->numerator
->negated(), $this->denominator, false);
}
/**
* Returns the simplified value of this BigRational.
*/
public function simplified() : BigRational {
$gcd = $this->numerator
->gcd($this->denominator);
$numerator = $this->numerator
->quotient($gcd);
$denominator = $this->denominator
->quotient($gcd);
return new BigRational($numerator, $denominator, false);
}
public function compareTo(BigNumber|int|float|string $that) : int {
return $this->minus($that)
->getSign();
}
public function getSign() : int {
return $this->numerator
->getSign();
}
public function toBigInteger() : BigInteger {
$simplified = $this->simplified();
if (!$simplified->denominator
->isEqualTo(1)) {
throw new RoundingNecessaryException('This rational number cannot be represented as an integer value without rounding.');
}
return $simplified->numerator;
}
public function toBigDecimal() : BigDecimal {
return $this->numerator
->toBigDecimal()
->exactlyDividedBy($this->denominator);
}
public function toBigRational() : BigRational {
return $this;
}
public function toScale(int $scale, RoundingMode $roundingMode = RoundingMode::UNNECESSARY) : BigDecimal {
return $this->numerator
->toBigDecimal()
->dividedBy($this->denominator, $scale, $roundingMode);
}
public function toInt() : int {
return $this->toBigInteger()
->toInt();
}
public function toFloat() : float {
$simplified = $this->simplified();
return $simplified->numerator
->toFloat() / $simplified->denominator
->toFloat();
}
public function __toString() : string {
$numerator = (string) $this->numerator;
$denominator = (string) $this->denominator;
if ($denominator === '1') {
return $numerator;
}
return $this->numerator . '/' . $this->denominator;
}
/**
* This method is required for serializing the object and SHOULD NOT be accessed directly.
*
* @internal
*
* @return array{numerator: BigInteger, denominator: BigInteger}
*/
public function __serialize() : array {
return [
'numerator' => $this->numerator,
'denominator' => $this->denominator,
];
}
/**
* This method is only here to allow unserializing the object and cannot be accessed directly.
*
* @internal
* @psalm-suppress RedundantPropertyInitializationCheck
*
* @param array{numerator: BigInteger, denominator: BigInteger} $data
*
* @throws \LogicException
*/
public function __unserialize(array $data) : void {
if (isset($this->numerator)) {
throw new \LogicException('__unserialize() is an internal function, it must not be called directly.');
}
$this->numerator = $data['numerator'];
$this->denominator = $data['denominator'];
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overriden Title |
---|---|---|---|---|
BigNumber::add | private static | function | Adds two BigNumber instances in the correct order to avoid a RoundingNecessaryException. | |
BigNumber::cleanUp | private static | function | Removes optional leading zeros and applies sign. | |
BigNumber::isEqualTo | final public | function | Checks if this number is equal to the given one. | |
BigNumber::isGreaterThan | final public | function | Checks if this number is strictly greater than the given one. | |
BigNumber::isGreaterThanOrEqualTo | final public | function | Checks if this number is greater than or equal to the given one. | |
BigNumber::isLessThan | final public | function | Checks if this number is strictly lower than the given one. | |
BigNumber::isLessThanOrEqualTo | final public | function | Checks if this number is lower than or equal to the given one. | |
BigNumber::isNegative | final public | function | Checks if this number is strictly negative. | |
BigNumber::isNegativeOrZero | final public | function | Checks if this number is negative or zero. | |
BigNumber::isPositive | final public | function | Checks if this number is strictly positive. | |
BigNumber::isPositiveOrZero | final public | function | Checks if this number is positive or zero. | |
BigNumber::isZero | final public | function | Checks if this number equals zero. | |
BigNumber::jsonSerialize | final public | function | ||
BigNumber::max | final public static | function | Returns the maximum of the given values. | |
BigNumber::min | final public static | function | Returns the minimum of the given values. | |
BigNumber::newBigDecimal | final protected | function | Proxy method to access BigDecimal's protected constructor from sibling classes. | |
BigNumber::newBigInteger | final protected | function | Proxy method to access BigInteger's protected constructor from sibling classes. | |
BigNumber::newBigRational | final protected | function | Proxy method to access BigRational's protected constructor from sibling classes. | |
BigNumber::of | final public static | function | Creates a BigNumber of the given value. | |
BigNumber::PARSE_REGEXP_NUMERICAL | private | constant | The regular expression used to parse integer or decimal numbers. | |
BigNumber::PARSE_REGEXP_RATIONAL | private | constant | The regular expression used to parse rational numbers. | |
BigNumber::sum | final public static | function | Returns the sum of the given values. | |
BigNumber::_of | private static | function | @psalm-pure | |
BigRational::$denominator | private | property | The denominator. Always strictly positive. | |
BigRational::$numerator | private | property | The numerator. | |
BigRational::abs | public | function | Returns the absolute value of this BigRational. | |
BigRational::compareTo | public | function | Compares this number to the given one. | Overrides BigNumber::compareTo |
BigRational::dividedBy | public | function | Returns the result of the division of this number by the given one. | |
BigRational::from | protected static | function | @psalm-pure | Overrides BigNumber::from |
BigRational::getDenominator | public | function | ||
BigRational::getNumerator | public | function | ||
BigRational::getSign | public | function | Returns the sign of this number. | Overrides BigNumber::getSign |
BigRational::minus | public | function | Returns the difference of this number and the given one. | |
BigRational::multipliedBy | public | function | Returns the product of this number and the given one. | |
BigRational::nd | public static | function | Creates a BigRational out of a numerator and a denominator. | |
BigRational::negated | public | function | Returns the negated value of this BigRational. | |
BigRational::one | public static | function | Returns a BigRational representing one. | |
BigRational::plus | public | function | Returns the sum of this number and the given one. | |
BigRational::power | public | function | Returns this number exponentiated to the given value. | |
BigRational::quotient | public | function | Returns the quotient of the division of the numerator by the denominator. | |
BigRational::quotientAndRemainder | public | function | Returns the quotient and remainder of the division of the numerator by the denominator. | |
BigRational::reciprocal | public | function | Returns the reciprocal of this BigRational. | |
BigRational::remainder | public | function | Returns the remainder of the division of the numerator by the denominator. | |
BigRational::simplified | public | function | Returns the simplified value of this BigRational. | |
BigRational::ten | public static | function | Returns a BigRational representing ten. | |
BigRational::toBigDecimal | public | function | Converts this number to a BigDecimal. | Overrides BigNumber::toBigDecimal |
BigRational::toBigInteger | public | function | Converts this number to a BigInteger. | Overrides BigNumber::toBigInteger |
BigRational::toBigRational | public | function | Converts this number to a BigRational. | Overrides BigNumber::toBigRational |
BigRational::toFloat | public | function | Returns an approximation of this number as a floating-point value. | Overrides BigNumber::toFloat |
BigRational::toInt | public | function | Returns the exact value of this number as a native integer. | Overrides BigNumber::toInt |
BigRational::toScale | public | function | Converts this number to a BigDecimal with the given scale, using rounding if necessary. | Overrides BigNumber::toScale |
BigRational::zero | public static | function | Returns a BigRational representing zero. | |
BigRational::__construct | protected | function | Protected constructor. Use a factory method to obtain an instance. | |
BigRational::__serialize | public | function | This method is required for serializing the object and SHOULD NOT be accessed directly. | |
BigRational::__toString | public | function | Returns a string representation of this number. | Overrides BigNumber::__toString |
BigRational::__unserialize | public | function | This method is only here to allow unserializing the object and cannot be accessed directly. |