From 289906edb407b57d16adaf64d9dd08f0c8f487a9 Mon Sep 17 00:00:00 2001 From: Rafael Vuijk Date: Fri, 16 Oct 2026 21:58:41 +0000 Subject: [PATCH 1/3] Record three changed answers the breaking changes missed Measured on the 2.5.0 package and on master: pi and an exponential evaluated at a higher precision after a lower one (#1368), the parse cache across the downcasting setting (#1517), and a difference of a negated term in a solution and in LaTeX (#1397). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_012sonx8iAspMiwRwokT1Ura --- BREAKING-CHANGES.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/BREAKING-CHANGES.md b/BREAKING-CHANGES.md index a1f9d34ed..3332bccc9 100644 --- a/BREAKING-CHANGES.md +++ b/BREAKING-CHANGES.md @@ -134,6 +134,40 @@ the working digits, or `MathS.Settings.PrecisionErrorZeroRange` where a caller h still that integer, so `e^(-123.456)` is 0 as it was. [#1338](https://github.com/asc-community/AngouriMath/issues/1338). +### A constant or an exponential evaluated at a higher precision than before has all of its digits + +**More digits where there were a hundred.** `pi`, `e` and an exponential, evaluated once at one precision, went on +answering in that precision under a higher one: in 2.5.0 `pi` read under 300 digits after a read under 100 had 100 +digits, and `e^(1/3)` the same. Each is now worked out in the precision asked for +([#1367](https://github.com/asc-community/AngouriMath/issues/1367), #1368). + +| Input | Was (2.5.0) | Now | +|---|---|---| +| `MathS.pi.Evaled` under 300 digits, after a read under 100 | 100 digits | 300 digits | +| `"e^(1/3)".Evaled` under 300 digits, after a read under 100 | 100 digits | 300 digits | + +### A string parsed once is parsed again under the other downcasting setting + +**A different number.** `MathS.FromString` remembered what it had parsed, keyed on the parsing setting alone. A string +parsed with downcasting on came back with its exact numbers under downcasting off, and the other way round. The +cache is now keyed on the downcasting setting too +([#1513](https://github.com/asc-community/AngouriMath/issues/1513), #1517). + +| Input | Was (2.5.0) | Now | +|---|---|---| +| `MathS.FromString("1/3").Evaled` under downcasting off, after the same parse with it on | `1/3` | `0.3333…` (one hundred digits) | + +### A difference of a negated term is printed as a sum + +**A printed form.** A solution and a difference were printed with the sign of a negative factor left inside: +`b - x = 0` solved for `x` printed `-b / (-1)`, and LaTeX printed `1/100 - (-4) x` as `\frac{1}{100}--4 \cdot x`, which does +not read back. Both are simplified to the sum now (#1397). + +| Input | Was (2.5.0) | Now | +|---|---|---| +| `"b - x = 0".Solve("x")` | `{ -b / (-1) }` | `{ b }` | +| `"1/100 - (-4)*x".ToEntity().Latexize()` | `\frac{1}{100}--4 \cdot x` | `\frac{1}{100}+4 \cdot x` | + ### A piecewise is defined where the case it takes is **Domain conditions that were false.** The domain condition of a piecewise asked every case's predicate From 15b1fe706cee47834be8049d8345fdbdf95e20a1 Mon Sep 17 00:00:00 2001 From: Rafael Vuijk Date: Fri, 16 Oct 2026 21:59:48 +0000 Subject: [PATCH 2/3] Record the NaN for an exponential times a cosine with a complex rate Measured: e^(-i x) cos(x) is NaN + C on 2.5.0, x/2 + e^(-2 i x)/(-4 i) on master. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_012sonx8iAspMiwRwokT1Ura --- BREAKING-CHANGES.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/BREAKING-CHANGES.md b/BREAKING-CHANGES.md index 3332bccc9..2a9ae3818 100644 --- a/BREAKING-CHANGES.md +++ b/BREAKING-CHANGES.md @@ -2938,6 +2938,18 @@ Each of these was checked by differentiating it back with the parameters pinned four points. The Rubi sample is unchanged at 231 of 463 with no wrong answers, so nothing that already had an antiderivative moves. +### `NaN` a fifth time, from an exponential times a cosine with a complex rate + +**A wrong answer.** `e^(-i x) cos(x)` was answered `NaN + C`: the closed form `P(x) e^(a x) cos(b x)` divides by +`a^2 + b^2`, which is `(-i)^2 + 1 = 0` here, the resonance that leaves a term linear in `x`. It is integrated through the +exponential form now, and so is `e^(-i arctan(a x))/(c + a^2 c x^2)^(3/2)`, which comes to it +(PR [#1380](https://github.com/asc-community/AngouriMath/pull/1380)). + +| Input | Was (2.5.0) | Now | +|---|---|---| +| `"e^(-i*x)*cos(x)".Integrate("x")` | `NaN + C` | `x/2 + e^(-2 i x)/(-4 i)` up to form | +| `"e^(-i*atan(a*x))/(c+a^2*c*x^2)^(3/2)".Integrate("x")` | `integral(...)` | an answer | + ### `NaN` a fourth time, from an exponent that is `-1` only as a value **A wrong answer.** `x^(-1 - 3n) (a + b x^n)^3` came back as a sum whose last term was `x^0/0`, so From b473e69195a0e9b24064b09fb6ef7912cf18144a Mon Sep 17 00:00:00 2001 From: Rafael Vuijk Date: Fri, 16 Oct 2026 22:00:29 +0000 Subject: [PATCH 3/3] Record the complex division that underflowed to zero Measured with the downcasting off: (1.98e119 + i)/(3.39e125 + i) is 0 on 2.5.0, 5.84e-7 on master. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_012sonx8iAspMiwRwokT1Ura --- BREAKING-CHANGES.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BREAKING-CHANGES.md b/BREAKING-CHANGES.md index 2a9ae3818..23849f169 100644 --- a/BREAKING-CHANGES.md +++ b/BREAKING-CHANGES.md @@ -168,6 +168,17 @@ not read back. Both are simplified to the sum now (#1397). | `"b - x = 0".Solve("x")` | `{ -b / (-1) }` | `{ b }` | | `"1/100 - (-4)*x".ToEntity().Latexize()` | `\frac{1}{100}--4 \cdot x` | `\frac{1}{100}+4 \cdot x` | +### A complex number divided by one beyond `10^50` in modulus is not zero + +**A wrong answer.** With the downcasting off, a complex division took the reciprocal of the divisor's squared modulus +first, and beyond `10^50` that underflowed the context to zero, so `(1.98e119 + i)/(3.39e125 + i)` was `0`. It is +divided by Smith's method now, which scales by the larger part and squares nothing +([#1372](https://github.com/asc-community/AngouriMath/issues/1372), #1374). + +| Input | Was (2.5.0) | Now | +|---|---|---| +| `(1.98e119 + i)/(3.39e125 + i)` with the downcasting off | `0` | `5.8407…e-7` | + ### A piecewise is defined where the case it takes is **Domain conditions that were false.** The domain condition of a piecewise asked every case's predicate