2017-11-26 5 views
0

http://floating-point-gui.de/formats/binary/Fließkomma: Kann ich rekursiv/mehrere Zahlen durch 2 teilen und bekomme niemals Rundungsfehler?

binäres Es kann nur solche Zahlen als endliche Fraktion darstellen, wo die Nenner eine Potenz von 2

Bedeutet dies, dass die durch dieses Verfahren berechneten Zahlen können alle zuzugebenden oder beliebig oft multipliziert mit 2 und haben immer noch eine exakte binäre/Gleitkommadarstellung ohne Rundungsfehler?

Ist es möglich zu bestimmen, wann eine Gleitkommazahl genau oder eine Annäherung ist?

+0

In welcher Sprache arbeiten Sie? Es gibt eine Grenze in der Auflösung, nach der Sie nicht kleiner werden können (C# schweben um -3,4 × 1038 bis + 3,4 × 1038) mit einer Genauigkeit von 7 Ziffern. –

+0

Javascript und Speichern von Zahlen in SQLite als Typ real (float 8 Byte IEEE) – zino

Antwort

4

Ja, solange Sie einen binären Fließkommawert verwenden (z. B. den sehr häufigen binären Fließkommawert IEEE-754) und nicht auf Unendlich oder Unterlauf zu subnormalen Zahlen überlaufen. Im binären Fließkomma ist die Multiplikation oder Division durch zwei genau, bis die Exponentengrenzen erreicht sind.

Für 32-Bit IEEE-754-Binär-, die finite Normalwerte gehen von bis zu 2 -2 und bis zu 2 -126. (Es gibt positive subnormale Werte so niedrig wie 2 -149, aber sie haben weniger Bits in ihre Mantisse [fraction part] als normale Zahlen, so Präzision verringert.)

Für 64-Bit IEEE-754 binär, die endlichen Normalwerte gehen bis zu 2 -2 und hinunter zu 2 -1022. (Es gibt positive subnormale Werte so niedrig wie 2 -1074.)

Es gibt keinen Weg (ohne Rahmen), um zu bestimmen, ob eine Gleitkommazahl genau darstellt oder approximiert nur einige vorherige Nummer. (Es gibt eine Möglichkeit zu erkennen, wenn Gleitkommaoperationen ein Ergebnis gerundet haben. Der Zugriff auf diese zusätzlichen Informationen wird in Implementierungen von Programmiersprachen oft vernachlässigt.) Sobald eine Zahl in eine Gleitkommazahl umgewandelt wurde, wird die Gleitkommazahl genau dargestellt was es darstellt. Es enthält keine Informationen über den Umfang des Rundungsfehlers, der zuvor aufgetreten ist. (Wenn Sie andere Informationen über die vorherige Nummer haben, z. B. dass sie aus einer Dezimalzahl mit fünf signifikanten Ziffern besteht, können Sie möglicherweise etwas über die ursprüngliche Nummer ableiten.)

+0

"möglich zu bestimmen, wann eine Fließkommazahl genau ist" -> Hat Javascript Zugriff auf FP-Flags wie _inexact_? – chux

+0

@chux: Ich bezweifle es. "Ungenau" erscheint nicht im ECMA-262-Standard, und auch nicht "Unterlauf", was ich mindestens einmal erwarten würde, wenn IEEE-754-Gleitkommaflags unterstützt würden. Aber ich habe die Antwort bearbeitet, um die Möglichkeit zu erwähnen. –

Verwandte Themen