Frage

Im follow-up zu diese Frage, es scheint, dass einige zahlen nicht dargestellt werden können, die von floating point auf, und statt angenähert.

Wie Gleitkommazahlen gespeichert?

Gibt es einen gemeinsamen standard für die verschiedenen Größen?

Welche Fallstricke muss ich achten, wenn ich mit floating-point?

Sind Sie Kreuz-Sprache kompatibel (ie, welche Konvertierungen tun ich benötigen, um mit zu senden eine Gleitkommazahl aus einem python-Programm in ein C-Programm über TCP/IP)?

-Adam

War es hilfreich?

Lösung

Wie bereits erwähnt, das Wikipedia-Artikel über IEEE 754 macht einen guten Job zu zeigen, wie Gleitkommazahlen gespeichert sind, auf den meisten Systemen.

Nun, hier sind einige typische Hinweise:

  • Die größte ist, dass man fast nie zwei Gleitkommazahlen für die Gleichstellung (oder Ungleichheit) vergleichen wollen. Sie wollen mehr verwenden, als / weniger als Vergleiche statt.
  • Je mehr Operationen, die Sie auf einer Gleitkommazahl tun, können die bedeutendere Rundungsfehler werden.
  • Die Präzision wird durch die Größe der Fraktion beschränkt, so können Sie richtig nicht in der Lage zu Zahlen addieren, die von mehreren Größenordnungen voneinander getrennt sind. (Zum Beispiel werden Sie nicht in der Lage sein, 1E30 bis 1E30 hinzuzufügen.)

Andere Tipps

Eine ausführliche Erläuterung der Probleme Gleitkommazahlen umgibt, wird im Artikel gegeben Was jeder Informatiker wissen sollten über Gleitkommaarithmetik .

Der Standard ist IEEE 754 .

Natürlich gibt es andere Mittel Zahlen zu speichern, wenn IEE754 nicht gut genug ist. Bibliotheken wie Java BigDecimal sind für die meisten Plattformen und Karte gut zu SQL Nummer Art sind verfügbar. Symbole können für irrationale Zahlen verwendet werden, und die Verhältnisse, die nicht genau in binäre oder dezimale Gleitkomma dargestellt werden kann, kann als ein Verhältnis gespeichert werden.

Zum zweiten Teil Ihrer Frage, es sei denn, Leistung und Effizienz für Ihr Projekt wichtig sind, dann empfehle ich Ihnen die Floating-Point-Daten als String über TCP / IP übertragen. Auf diese Weise können Sie Probleme vermeiden, wie Byte-Ausrichtung und das Debuggen erleichtern.

Im Grunde, was Sie in Gleitkommazahlen befürchten müssen, ist, dass es eine begrenzte Anzahl von Stellen genau ist. Dies kann zu Problemen führen, wenn für die Gleichstellung zu testen, oder wenn Ihr Programm tatsächlich mehr Stellen genau als das, was Art dieser Daten benötigt gibt Ihnen.

In C ++, eine gute Faustregel zu denken, dass ein Schwimmer Sie 7 Ziffern der Präzision gibt, während ein Doppel Sie 15. Auch gibt, wenn Sie daran interessiert sind zu wissen, wie die Gleichheit zu testen, die Sie sehen können < a href = "https://stackoverflow.com/questions/21265/comparing-ieee-floats-and-doubles-for-equality"> dieser Frage Thread.

  

In folgen auf diese Frage auf, es   scheint, dass einige Zahlen nicht sein kann   dargestellt durch überhaupt Gleitkomma-,   und stattdessen angenähert.

Richtig.

  

Wie werden Gleitkommazahlen gespeichert?   Gibt es einen gemeinsamen Standard für die verschiedenen Größen?

Wie die anderen Plakate bereits erwähnt, fast ausschließlich IEEE754 und Nachfolge IEEE754R. es gibt Ihnen tausend Erklärungen zusammen mit Bitmuster und ihre Erklärung googeln. Wenn Sie immer noch Probleme haben, um es zu bekommen, gibt es zwei noch gemeinsame FP-Formate: IBM und DEC-VAX. Für einige esoterische Maschinen und Compiler (Blitzbasic, Turbopascal) gibt es einige ungeradee Formate.

  

Welche Art von gotchas brauche ich für aufpassen, wenn ich Punkt verwenden Floating?   Sind sie Quer Sprache kompatibel (dh welche Conversions muss ich behandeln zu   Bitte senden Sie eine Gleitkommazahl aus einem Python-Programm zu einem C-Programm über TCP / IP)?

Praktisch keine, sie sind Quer Sprache kompatibel.

Sehr selten auftretende Macken:

  • IEEE754 definiert sNaNs (Signalisierung NaNs) und qNaNs (leise NaNs). Die ersteren bewirken eine Falle, die den Prozessor erzwingt eine Handler-Routine aufrufen, wenn geladen. Letztere tun dies nicht. Da Sprachdesigner die Möglichkeit, gehasst, die sNaNs ihren Workflow zu unterbrechen und sie unterstützen Unterstützung für Handler-Routinen durchzusetzen, werden sNaNs fast immer still in qNaNs umgewandelt. So verlassen sich nicht auf einer 1: 1 Raw-Konvertierung. Aber noch einmal: Das ist sehr selten und kommt nur, wenn NaNs vorhanden ist.

  • Sie können Probleme mit endianness haben (das Bytes in der falschen Reihenfolge ist), wenn Dateien zwischen verschiedenen Computern gemeinsam genutzt werden. Es ist leicht zu erkennen, weil Sie NaNs für Zahlen.

  • bekommen

Ja, es ist die IEEE-Norm für binäre Gleitkomma-Arithmetik (IEEE 754)

Die Zahl wird in drei Teile geteilt, Vorzeichen, Exponent und Fraktion, wenn binär gespeichert.

Das Artikel dem Titel "IEEE-Standard 754 Gleitkommasystems" kann rel="nofollow sein hilfreich. Um ehrlich zu sein bin ich nicht ganz sicher, verstehe ich Ihre Frage so bin ich nicht sicher, dass dies hilfreich sein wird, aber ich hoffe, es wird.

Wenn Sie wirklich besorgt sind über Floating-Point-Rundungsfehler, bieten die meisten Sprachen Datentypen, die keine Fließkommafehler haben. SQL Server hat die Dezimal und Money-Datentypen. NET hat den Dezimal-Datentyp. Sie sind nicht unendlich Präzision wie BigDecimal in Java, aber sie sind präzise bis auf die Anzahl der Dezimalstellen sie definiert sind. So haben Sie Ihnen keine Sorgen über einen Dollar Wert eingeben als 4,58 $ als Fließkommawert 4,579999999999997 gespeichert zu werden

Was ich erinnere mich, ist ein 32-Bit-Gleitkomma gespeichert sind 24 Bits für eine tatsächliche Zahl verwenden, und die bleiben 8 Bits als eine Leistung von 10 verwendet werden, zu bestimmen, wo das Komma ist.

Ich bin ein bisschen rostig zum Thema tho ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top