Subtraction ist in der Regel über die Kahan-Methode behandelt. Für die Multiplikation gibt es Algorithmen, um ein Produkt aus zwei Gleitpunktzahlen in eine Summe von zwei Gleitkommazahlen ohne Rundung zu konvertieren. An diesem Punkt können Sie die Kahan- Addition oder eine andere Methode verwenden, je nachdem, was Sie benötigen als nächstes mit dem Produkt zu tun.
Wenn Sie FMA (fusioniert Multiply-Add) zur Verfügung, kann dies leicht erreicht werden, wie folgt:
p = a*b;
r = fma(a,b,-p);
Nach diesen beiden Operationen, wenn keine Über- oder Unterlauf auftritt, p + r
genau gleich a * b
ohne Rundung. Dies kann auch ohne FMA erreicht werden, ist jedoch etwas schwieriger. Wenn Sie sich für diese Algorithmen interessieren, können Sie beginnen, indem Sie die crlibm
documentation herunterladen, die einige von ihnen beschreibt.
Division ... Nun, Division ist am besten zu vermeiden. Die Division ist langsam und die kompensierte Division ist noch langsamer. Sie können es tun, aber es ist brutal schwer ohne FMA und nicht-trivial damit. Besser, deine Algorithmen so zu gestalten, dass sie so weit wie möglich vermieden werden.
Beachten Sie, dass all dies eine verlorene Schlacht ziemlich schnell wird. Es gibt eine sehr kleine Bandbreite von Situationen, in denen diese Tricks nützlich sind - für etwas Komplizierteres ist es viel besser, einfach eine Gleitkomma-Bibliothek mit einer größeren Genauigkeit wie mpfr zu verwenden. Wenn Sie kein Experte auf diesem Gebiet sind (oder einer davon werden wollen), ist es normalerweise am besten, nur eine solche Bibliothek zu erlernen.
AFAIK, mit breiteren Typen ist nur eine schlechte Hilfe und wird sehr wenig helfen, wenn Ihr Problem schlecht konditioniert oder Ihr Algorithmus nicht stabil ist. –
@Michael Borgwardt: Das hängt vom Problem ab. Wenn Ihr Problem schlecht konditioniert ist, dann sind entweder Ihre Eingabedaten exakt (in diesem Fall wird die Erhöhung der Genauigkeit tatsächlich helfen, sobald Sie einen Schwellenwert überschreiten), oder die Antwort ist sowieso bedeutungslos (in diesem Fall spielt es keine Rolle). Wenn Ihr Algorithmus instabil ist, hängt dies von der genauen Art der Instabilität ab. Allgemeiner kann jedoch jedes Problem, das durch die Verwendung von kompensierter Arithmetik behoben werden kann, auch durch Verwendung breiterer Typen gelöst werden. –
So neugierig wie ich bin, so gern ich alles über alles wissen würde, ich weiß, ich werde mich erst einmal mit Bibliotheken und ähnlichem beschäftigen müssen, vielen Dank für Ihre Antwort, ich werde es mir ansehen so schnell wie möglich. :) – Geoff