Betrachten (a-b)/(c-d)
Betrieb, wo a
, b
, c
und d
sind Gleitkommazahlen (nämlich double
Typ in C++). Sowohl (a-b)
als auch (c-d)
sind (sum
- correction
) Paare, wie in Kahan summation algorithm. Kurz gesagt, das Spezifische dieser (sum
- correction
) Paare ist, dass sum
einen großen Wert relativ zu dem enthält, was in correction
ist. Genauer gesagt, correction
enthält, was nicht in sum
während der Summation aufgrund numerischer Einschränkungen (53 Bits der Mantisse in double
Typ) passen.Was ist die numerisch genaueste Methode, um Summen oder Differenzen zu teilen?
Was ist die numerisch genaueste Art zu berechnen (a-b)/(c-d)
angesichts der oben genannten Spezialität der Zahlen?
Bonus Frage: es wäre besser, das Ergebnis auch als (sum
- correction
), wie in Kahan Summenalgorithmus zu bekommen. So zu finden (e-f)=(a-b)/(c-d)
, anstatt nur e=(a-b)/(c-d)
.
Mit 'return r + s' meinen Sie' e = r' und 'f = -s' im Ausdruck' (ef) = (ab)/(cd) '? Oder gibt es einen Fehler und zwar 'e = r' und' f = s' (ohne 's' zu negieren)? –
Das Ergebnis sollte sein: 'r + s = (ab)/(cd)' –
Ich habe den Ansatz noch nicht überprüft (braucht viel Zeit, um gründlich zu denken), aber das 'fma()' Ding ist extrem nützlich, + 1. Grundsätzlich verliert "(a - u - v - b + r * d)" die Genauigkeit, oder wird hier die Kahan-Summe erwartet? –