Stand
numerics/norms.py summiert die Spurgleichungen ueber scaled_column_sums. Der Aufbau wurde in PR #139 zweimal ersetzt und ist jetzt: erst blankes math.fsum (exakt, kein Unterlauf), und nur bei OverflowError ein Rueckfall auf zwei Exponentenbaender bei 2^512.
Dieser Rueckfall hat eine bekannte, gemessene Grenze.
Der Befund (Review an PR #139, norms.py:173)
"When math.fsum overflows, independently rounding the high and low bands before adding them can still erase cross-band cancellation residuals. Fresh evidence: [7e307]*3 + [-7e307]*3 + [2**513] + [-2**511]*4 + [1e-300] — its exact sum is 1e-300, but this path returns 0.0 because the low-band sum rounds away the tiny addend before recombination. Used as the 12 trace-row coefficients of a finite 144×144 operator, both trace-preservation readings become zero and restrict_to_traceless(..., tp_rtol=0) accepts the non-trace-preserving operator, so the fallback needs an accumulator that preserves partials across bands until the final rounding."
Warum zwei unabhaengig gerundete Baender das nicht koennen: jedes Band wird fuer sich auf ein float64 gerundet, bevor addiert wird. Ein Rest, der im unteren Band unter dessen eigener Rundung liegt, ist zum Zeitpunkt der Rekombination bereits weg — die Auskunft, dass da noch etwas war, existiert nicht mehr. Das ist keine Toleranzfrage, sondern Informationsverlust vor der letzten Rundung.
Dazu die bereits dokumentierte 1-ulp-Grenze
Unabhaengig davon wurde im selben PR gemessen: im Bandpfad 3 Abweichungen von 1 ulp bei 20000 Faellen (Ergebnisse ab 1e182, doppelte Rundung bei der Rekombination). Dabei 0 faelschliche Nullen und 0 Vorzeichenfehler bei 19965 gezielt ausloeschenden Faellen. Beides — die 1-ulp-Ungenauigkeit und der Kreuz-Band-Verlust oben — hat dieselbe Wurzel und faellt mit derselben Loesung weg.
Was traegt
Ein Akkumulator, der die Partialsummen ueber Bandgrenzen hinweg haelt und erst am Ende ein einziges Mal rundet — also Shewchuk-artig (wie math.fsum intern), aber mit einer Ueberlauf-Behandlung, die die Partialsummen nicht vorzeitig zusammenfaltet. Das ist eine eigene Konstruktion mit eigenem Review, nicht ein weiterer Patch auf dem bestehenden Rueckfall.
Bemerkenswert an der Vorgeschichte, weil es die Prioritaet mitbestimmt: an dieser Funktion wurden fuenf Ebenen derselben Klasse gefunden (Verduennung zwischen Spalten, Ueberlauf, geteilte Real/Imag-Skala, Unterlauf unter der gemeinsamen Skala, jetzt Kreuz-Band-Verlust). Vier davon in fail-open-Richtung. Die dritte hat der Bauende selbst gefunden, indem er die Klasse auf die eigene Arbeit anwandte. Wer hier weiterbaut, sollte dieselbe Probe fahren.
Erreichbarkeit — ehrlich
Der Bandpfad wird nur von Eingaben betreten, die math.fsum zum Ueberlaufen bringen. Fuer Spurgleichungen physikalischer Generatoren ist das praktisch unerreichbar; die Belege oben sind konstruiert. Das senkt die Dringlichkeit, nicht die Richtigkeit: die Richtung ist fail-open, und ein Gate, das in einer erreichbaren Ecke etwas durchlaesst, ist die Klasse, gegen die dieses Modul gebaut wurde.
Vorschlag fuer die Zwischenzeit
Bis die exakte Loesung steht: den Rueckfallpfad fail-closed machen. Kann die Funktion die Genauigkeit nicht garantieren, meldet sie unbekannt (nicht-finit) statt 0.0, und das nachgelagerte Gate lehnt ab. Unmessbar ist nicht bestanden — genau die Unterscheidung, wegen der PR #139 ueberhaupt existiert. Das war fuer heute vorbereitet und ist nicht mehr umgesetzt worden.
Pflicht bei der Umsetzung
- Reproduktion des 11-Werte-Falls vor der Aenderung, plus die 144x144-Verwendung.
- Die vier bestehenden Gegenrichtungs-Nodes muessen gruen bleiben:
..._is_no_longer_refused, ..._does_not_reopen_the_diluted_defect, ..._real_and_imaginary_parts_separately, ..._keep_an_addend_below_the_dominant_scale.
- Positiv-Kontrolle mit gemessener Pfad-Trefferquote: eine Stichprobe, die den Bandpfad nur 1 von 6000 Mal betritt, misst nichts. Genau das ist im Vorlauf einmal passiert und wurde nur durch Nachzaehlen bemerkt.
- Diskriminierung beide Richtungen, Ziel ein pytest-Node, und die Wirksamkeit jeder Mutation vorab pruefen.
Herkunft der Zahlen
Alle Messwerte stammen aus den Bau- und Prueflaeufen zu PR #139 und sind nicht eigenhaendig nachgerechnet; die Reproduktionen sind im PR-Verlauf dokumentiert.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VG6CeFJVgem6n4Tsam1onb
Stand
numerics/norms.pysummiert die Spurgleichungen ueberscaled_column_sums. Der Aufbau wurde in PR #139 zweimal ersetzt und ist jetzt: erst blankesmath.fsum(exakt, kein Unterlauf), und nur beiOverflowErrorein Rueckfall auf zwei Exponentenbaender bei2^512.Dieser Rueckfall hat eine bekannte, gemessene Grenze.
Der Befund (Review an PR #139,
norms.py:173)Warum zwei unabhaengig gerundete Baender das nicht koennen: jedes Band wird fuer sich auf ein float64 gerundet, bevor addiert wird. Ein Rest, der im unteren Band unter dessen eigener Rundung liegt, ist zum Zeitpunkt der Rekombination bereits weg — die Auskunft, dass da noch etwas war, existiert nicht mehr. Das ist keine Toleranzfrage, sondern Informationsverlust vor der letzten Rundung.
Dazu die bereits dokumentierte 1-ulp-Grenze
Unabhaengig davon wurde im selben PR gemessen: im Bandpfad 3 Abweichungen von 1 ulp bei 20000 Faellen (Ergebnisse ab 1e182, doppelte Rundung bei der Rekombination). Dabei 0 faelschliche Nullen und 0 Vorzeichenfehler bei 19965 gezielt ausloeschenden Faellen. Beides — die 1-ulp-Ungenauigkeit und der Kreuz-Band-Verlust oben — hat dieselbe Wurzel und faellt mit derselben Loesung weg.
Was traegt
Ein Akkumulator, der die Partialsummen ueber Bandgrenzen hinweg haelt und erst am Ende ein einziges Mal rundet — also Shewchuk-artig (wie
math.fsumintern), aber mit einer Ueberlauf-Behandlung, die die Partialsummen nicht vorzeitig zusammenfaltet. Das ist eine eigene Konstruktion mit eigenem Review, nicht ein weiterer Patch auf dem bestehenden Rueckfall.Bemerkenswert an der Vorgeschichte, weil es die Prioritaet mitbestimmt: an dieser Funktion wurden fuenf Ebenen derselben Klasse gefunden (Verduennung zwischen Spalten, Ueberlauf, geteilte Real/Imag-Skala, Unterlauf unter der gemeinsamen Skala, jetzt Kreuz-Band-Verlust). Vier davon in fail-open-Richtung. Die dritte hat der Bauende selbst gefunden, indem er die Klasse auf die eigene Arbeit anwandte. Wer hier weiterbaut, sollte dieselbe Probe fahren.
Erreichbarkeit — ehrlich
Der Bandpfad wird nur von Eingaben betreten, die
math.fsumzum Ueberlaufen bringen. Fuer Spurgleichungen physikalischer Generatoren ist das praktisch unerreichbar; die Belege oben sind konstruiert. Das senkt die Dringlichkeit, nicht die Richtigkeit: die Richtung ist fail-open, und ein Gate, das in einer erreichbaren Ecke etwas durchlaesst, ist die Klasse, gegen die dieses Modul gebaut wurde.Vorschlag fuer die Zwischenzeit
Bis die exakte Loesung steht: den Rueckfallpfad fail-closed machen. Kann die Funktion die Genauigkeit nicht garantieren, meldet sie
unbekannt(nicht-finit) statt0.0, und das nachgelagerte Gate lehnt ab. Unmessbar ist nicht bestanden — genau die Unterscheidung, wegen der PR #139 ueberhaupt existiert. Das war fuer heute vorbereitet und ist nicht mehr umgesetzt worden.Pflicht bei der Umsetzung
..._is_no_longer_refused,..._does_not_reopen_the_diluted_defect,..._real_and_imaginary_parts_separately,..._keep_an_addend_below_the_dominant_scale.Herkunft der Zahlen
Alle Messwerte stammen aus den Bau- und Prueflaeufen zu PR #139 und sind nicht eigenhaendig nachgerechnet; die Reproduktionen sind im PR-Verlauf dokumentiert.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VG6CeFJVgem6n4Tsam1onb