2016-05-07 14 views
3

Führt das Ausführen von Operationen (wie Multiplikation, Division, Addition und Subtraktion) auf Floats und Doubles ihren Präzisionsgrad?Präzision der Multiplikation von Floats

Zum Beispiel, wenn ich multipliziert (oder geteilt, addiert, subtrahiert) 1000 Schwimmer zusammen, würde ich noch 7 Stellen der Genauigkeit beibehalten?

Ich habe auf dieser Website hier gelesen, dass die Genauigkeit beibehalten wird (http://floating-point-gui.de/formats/fp/), aber ich wollte überprüfen.

+0

überprüfen Sie bitte diese [URL] (http://stackoverflow.com/help) wird es helfen, Ihre Qualität des Inhalts zu erhöhen –

+0

Mit multiplizieren/teilen der durchschnittliche Verlust ist sqrt (N) oder etwa 30 Bits. – chux

Antwort

4

There's precision and there's accuracy. Die Genauigkeit eines float ist immer gleich. Die Genauigkeit Ihrer Berechnungen hängt jedoch von einer Vielzahl von implementierungsspezifischen Details ab.

Wenn beispielsweise bei jeder Berechnung ein halbes LSB des Fehlers eingeführt wird, kann das Ergebnis nach 1000 Berechnungen um 500 LSBs abweichen. Daher, obwohl die Antwort auf 7 Ziffern genau sein würde, würde es nur auf 4 Ziffern genau sein.

+0

Danke! Das habe ich gebraucht! –

+3

"Im schlimmsten Fall führt jede Berechnung zu einem halben LSB des Fehlers, also nach 1000 Berechnungen könnte Ihr Ergebnis um 500 LSBs abweichen." - Das ist eine ziemlich irreführende Aussage, wenn man berücksichtigt, dass "1 LSB" nicht bei jeder Berechnung gleich ist. Beispielsweise ist "1e20 + 14 - 1e20" im Allgemeinen auf 0 Stellen genau, obwohl nur Rundungsfehler von zwei Operationen auftreten. – user2357112

+0

@ user2357112 Fair genug, ich habe diesen Absatz umformuliert. Das Problem der kleinen Unterschiede in großen Zahlen ist tatsächlich ein Problem, aber es ist etwas anders als das Problem der angehäuften kleinen Fehler, die ich aufzuklären versuchte. – user3386109

1

Die Antwort hängt davon ab, was Sie unter "Genauigkeit beibehalten" verstehen. Ein einzelner Fließkomma-Punkt hat immer die gleiche "Genauigkeit" von etwa 7 Stellen (aufgrund des Binär-Speichers sind es nicht genau 7 Stellen).

Einige Berechnungen können einen Rundungsfehler verursachen, der das niedrigstwertige Bit inkorrekt machen kann, aber diese Fehler können sich addieren (wie user3386109 in ihrer Antwort erklärt) oder sie können verstärkt werden. Ein Beispiel für eine Amplifikation wäre, wenn ich eine Kalkülgrenze der Form (f(x+h)-f(x))/h als h auf Null gehen würde. Wenn f(x+0.0000001)sollte 3.1234567 sein, aber ich bekomme 3.1234566 und f(x) gibt die richtige 3.1234568. Nun sollte die Formel (3.1234567-3.1234568)/0.0000001 sein, was -1 ist, aber ich habe (3.1234566-3.1234568)/0.0000001, was -2 ist.

Plötzlich ist meine niedrigstwertige Ziffer meine wichtigste Ziffer. Es gibt andere Möglichkeiten, Rundungsfehler und Techniken zur Vermeidung von Rundungsfehlern zu verstärken.

Immer Achten Sie beim Umgang mit nicht ganzzahligen Typen auf Rundungsfehler. Some examples of rounding error failures