Frage

Ich habe gerade GDB verwendet, um einen Wert eines Doppelwerts auszudrucken, und zu meiner Überraschung druckte es -0

Was bedeutet ein Doppel von -0 -Wert in C?

Übrigens, als ich überprüft habe, dass es Gleichheit mit 0 ist, gab es wahr: Um den Vergleich durchzuführen, habe ich gerade Folgendes gemacht

in GDB

> print some_double
-0
> print some_double == 0
1
War es hilfreich?

Lösung

Negative Null ist ein nützliches Konzept für das numerische Computer und eine gültige schwimmende Punktzahl in C.

Andere Tipps

Dies ist ein bekanntes Problem mit printf. Da Sie eine schwimmende Punktzahl verwenden, ist in Binär keine Darstellung möglich. Und in den meisten Fällen ist die binäre Darstellung nicht perfekt. Also wird 0 als gespeichert als 0.00000000000000...0042 manchmal und wie -0.000000000000000000000123. Wenn Printf den zweiten druckt, erhalten Sie die ungerade -0.

Ich weiß nicht wirklich, wie Sie sich mit 0 vergleichen, sondern denken Sie daran, einen Epsilon hinzuzufügen, wenn Sie schwimmende Punktvergleiche durchführen, um sich an Kuriositäten anzupassen. ZB: Um zu testen, ob zwei Schwimmer gleich sind, schreiben Sie niemals a == b aber fabs(a-b) < 1e-13 wobei 1E-13 das Epsilon ist (wählen Sie einen Exponenten, der zu Ihnen passt).

Tatsächlich lesen Sie das Buch "Writing Great Code, Band 1" in Kapitel 4 Der Autor gibt der Antwort ganz klar, dass es sich um die Verwendung der Ergänzung von 1 zur Darstellung des signierten Floats im IEEE -FP -Standard handelt. Er sagt:

Der Mantissa verwendet eher das Komplementformat eines Eins -Komplements als das Komplement von zwei. Dies bedeutet, dass der 24-Bit-Wert der Mantissa einfach eine nicht signierte Binärzahl ist, und das Vorzeichenbit in Bitposition 31 bestimmt, ob dieser Wert positiv oder negativ ist. Die Komplementnummern haben das ungewöhnliche Eigentum Dass es zwei Darstellungen für Null gibt (mit dem Vorzeichenbit festgelegt oder klar). Im Allgemeinen ist dies nur für die Person wichtig, die die Floating-Punkt-Software oder das Hardware-System entworfen hat.

Hervorhebung meiner

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