diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt index 3410f6844..295f662e1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt @@ -129,6 +129,8 @@ private const val MEANINGFUL_BITS_DOUBLE = MEANINGFUL_BITS_LONG.toDouble() private val MEANINGFUL_BITS_CONTEXT = MathContext(MEANINGFUL_BITS) private val MEANINGFUL_BITS_BI = BigInteger.valueOf(MEANINGFUL_BITS_LONG) +private val BI_MINUS_ONE = -BigInteger.ONE + /** * Imprecise Fraction class for dealing with huge numbers that need fractional part to some extent. * @@ -312,30 +314,205 @@ class ImpreciseFraction @JvmOverloads constructor(whole: BigInteger, decimal: Do return ImpreciseFraction(div[0].toBigInteger(), div[1].toDouble() / bD) } - operator fun plus(other: Float): ImpreciseFraction = plus(ImpreciseFraction(other)) - operator fun minus(other: Float): ImpreciseFraction = minus(ImpreciseFraction(other)) - operator fun times(other: Float): ImpreciseFraction = times(ImpreciseFraction(other)) - operator fun div(other: Float): ImpreciseFraction = div(ImpreciseFraction(other)) + operator fun plus(other: Float): ImpreciseFraction { + if (other == 0f) { + return this + } - operator fun plus(other: Double): ImpreciseFraction = plus(ImpreciseFraction(other)) - operator fun minus(other: Double): ImpreciseFraction = minus(ImpreciseFraction(other)) - operator fun times(other: Double): ImpreciseFraction = times(ImpreciseFraction(other)) - operator fun div(other: Double): ImpreciseFraction = div(ImpreciseFraction(other)) + return plus(ImpreciseFraction(other)) + } - operator fun plus(other: Int): ImpreciseFraction = plus(ImpreciseFraction(other)) - operator fun minus(other: Int): ImpreciseFraction = minus(ImpreciseFraction(other)) - operator fun times(other: Int): ImpreciseFraction = times(ImpreciseFraction(other)) - operator fun div(other: Int): ImpreciseFraction = div(ImpreciseFraction(other)) + operator fun minus(other: Float): ImpreciseFraction { + if (other == 0f) { + return this + } - operator fun plus(other: Long): ImpreciseFraction = plus(ImpreciseFraction(other)) - operator fun minus(other: Long): ImpreciseFraction = minus(ImpreciseFraction(other)) - operator fun times(other: Long): ImpreciseFraction = times(ImpreciseFraction(other)) - operator fun div(other: Long): ImpreciseFraction = div(ImpreciseFraction(other)) + return minus(ImpreciseFraction(other)) + } - operator fun plus(other: BigInteger): ImpreciseFraction = plus(ImpreciseFraction(other)) - operator fun minus(other: BigInteger): ImpreciseFraction = minus(ImpreciseFraction(other)) - operator fun times(other: BigInteger): ImpreciseFraction = times(ImpreciseFraction(other)) - operator fun div(other: BigInteger): ImpreciseFraction = div(ImpreciseFraction(other)) + operator fun times(other: Float): ImpreciseFraction { + if (other == 1f) { + return this + } else if (other == 0f) { + return ZERO + } else if (other == -1f) { + return -this + } + + return times(ImpreciseFraction(other)) + } + + operator fun div(other: Float): ImpreciseFraction { + if (other == 0f) { + return NaN + } else if (other == 1f) { + return this + } else if (other == -1f) { + return -this + } + + return div(ImpreciseFraction(other)) + } + + operator fun plus(other: Double): ImpreciseFraction { + if (other == 0.0) { + return this + } + + return plus(ImpreciseFraction(other)) + } + + operator fun minus(other: Double): ImpreciseFraction { + if (other == 0.0) { + return this + } + + return minus(ImpreciseFraction(other)) + } + + operator fun times(other: Double): ImpreciseFraction { + if (other == 1.0) { + return this + } else if (other == 0.0) { + return ZERO + } else if (other == -1.0) { + return -this + } + + return times(ImpreciseFraction(other)) + } + + operator fun div(other: Double): ImpreciseFraction { + if (other == 0.0) { + return NaN + } else if (other == 1.0) { + return this + } else if (other == -1.0) { + return -this + } + + return div(ImpreciseFraction(other)) + } + + operator fun plus(other: Int): ImpreciseFraction { + if (other == 0) { + return this + } + + return plus(ImpreciseFraction(other)) + } + + operator fun minus(other: Int): ImpreciseFraction { + if (other == 0) { + return this + } + + return minus(ImpreciseFraction(other)) + } + + operator fun times(other: Int): ImpreciseFraction { + if (other == 1) { + return this + } else if (other == 0) { + return ZERO + } else if (other == -1) { + return -this + } + + return times(ImpreciseFraction(other)) + } + + operator fun div(other: Int): ImpreciseFraction { + if (other == 0) { + return NaN + } else if (other == 1) { + return this + } else if (other == -1) { + return -this + } + + return div(ImpreciseFraction(other)) + } + + operator fun plus(other: Long): ImpreciseFraction { + if (other == 0L) { + return this + } + + return plus(ImpreciseFraction(other)) + } + + operator fun minus(other: Long): ImpreciseFraction { + if (other == 0L) { + return this + } + + return minus(ImpreciseFraction(other)) + } + + operator fun times(other: Long): ImpreciseFraction { + if (other == 1L) { + return this + } else if (other == 0L) { + return ZERO + } else if (other == -1L) { + return -this + } + + return times(ImpreciseFraction(other)) + } + + operator fun div(other: Long): ImpreciseFraction { + if (other == 0L) { + return NaN + } else if (other == 1L) { + return this + } else if (other == -1L) { + return -this + } + + return div(ImpreciseFraction(other)) + } + + operator fun plus(other: BigInteger): ImpreciseFraction { + if (other == BigInteger.ZERO) { + return this + } + + return plus(ImpreciseFraction(other)) + } + + operator fun minus(other: BigInteger): ImpreciseFraction { + if (other == BigInteger.ZERO) { + return this + } + + return minus(ImpreciseFraction(other)) + } + + operator fun times(other: BigInteger): ImpreciseFraction { + if (other == BigInteger.ONE) { + return this + } else if (other == BigInteger.ZERO) { + return ZERO + } else if (other == BI_MINUS_ONE) { + return -this + } + + return times(ImpreciseFraction(other)) + } + + operator fun div(other: BigInteger): ImpreciseFraction { + if (other == BigInteger.ZERO) { + return NaN + } else if (other == BigInteger.ONE) { + return this + } else if (other == BI_MINUS_ONE) { + return -this + } + + return div(ImpreciseFraction(other)) + } operator fun unaryMinus(): ImpreciseFraction { return ImpreciseFraction(-whole, -decimal)