/** * Convert if possible a supplied argument to a rational * * @param int|float|string|NumericTypeInterface $value * * @return \Chippyash\Math\Matrix\RationalNumber * * @throws \Chippyash\Matrix\Exceptions\MatrixException * @throws \Exception */ protected function convertNumberToRational($value) { if ($value instanceof NumericTypeInterface) { return $value->asRational(); } switch (gettype($value)) { case 'integer': return RationalTypeFactory::create($value, 1); case 'double': return RationalTypeFactory::fromFloat($value); case 'string': try { return RationalTypeFactory::fromString($value); } catch (\Exception $e) { try { return ComplexTypeFactory::fromString($value)->asRational(); } catch (\Exception $ex) { throw new MatrixException('The string representation of the number is invalid for a rational'); } } case 'NULL': return RationalTypeFactory::create(0, 1); case 'boolean': return RationalTypeFactory::create($value ? 1 : 0, 1); default: throw new MatrixException('Rational expects int, float, string, Rational or NumericTypeInterface '); } }
/** * Check for rational type, converting if necessary * * @param NumericTypeInterface $a * @param NumericTypeInterface $b * @return array [RationalType, RationalType] */ protected function checkRationalTypes(NumericTypeInterface $a, NumericTypeInterface $b) { $a1 = $a instanceof RationalType ? $a : $a->asRational(); $b1 = $b instanceof RationalType ? $b : $b->asRational(); return [$a1, $b1]; }
/** * Check for float type, converting if necessary * * @param NumericTypeInterface $a * @param NumericTypeInterface $b * @return array [FloatType, FloatType] */ protected function checkFloatTypes(NumericTypeInterface $a, NumericTypeInterface $b) { $a1 = $a instanceof FloatType ? $a : $a->asFloatType(); $b1 = $b instanceof FloatType ? $b : $b->asFloatType(); return [$a1, $b1]; }
/** * Compare int and float types * * @param NI $a * @param NI $b * @return int */ protected function intFloatCompare(NI $a, NI $b) { return $this->rationalCompare(RationalTypeFactory::fromFloat($a->asFloatType()), RationalTypeFactory::fromFloat($b->asFloatType())); }