Seprate calculate, 反比例函数

This commit is contained in:
2025-09-14 17:37:45 +08:00
parent a1d4400455
commit 91bb1f77ba
4 changed files with 176 additions and 32 deletions

View File

@@ -80,11 +80,18 @@ class FractionExpr extends Expr {
final int denominator;
FractionExpr(this.numerator, this.denominator) {
if (denominator == 0) throw Exception("分母不能为0");
// Allow denominator 0 to handle division by zero
}
@override
Expr simplify() {
if (denominator == 0) {
if (numerator == 0) return DoubleExpr(double.nan);
return DoubleExpr(
numerator.isNegative ? double.negativeInfinity : double.infinity,
);
}
int g = _gcd(numerator.abs(), denominator.abs());
int n = numerator ~/ g;
int d = denominator ~/ g;
@@ -469,6 +476,23 @@ class DivExpr extends Expr {
).simplify();
}
// Handle DoubleExpr cases
if (l is DoubleExpr && r is DoubleExpr) {
return DoubleExpr(l.value / r.value);
}
if (l is IntExpr && r is DoubleExpr) {
return DoubleExpr(l.value.toDouble() / r.value);
}
if (l is DoubleExpr && r is IntExpr) {
return DoubleExpr(l.value / r.value.toDouble());
}
if (l is FractionExpr && r is DoubleExpr) {
return DoubleExpr((l.numerator.toDouble() / l.denominator) / r.value);
}
if (l is DoubleExpr && r is FractionExpr) {
return DoubleExpr(l.value / (r.numerator.toDouble() / r.denominator));
}
// handle (k * sqrt(X)) / d 约分
if (l is MulExpr &&
l.left is IntExpr &&