Ich habe nur gdb verwendet, um einen Wert von einem Doppel zu drucken und zu meiner Überraschung -0
gedrucktWas ist ein doppelter Wert von -0 in C?
Übrigens, als ich überprüft habe, ob es gleich 0 ist, ist es wahr: Um den Vergleich zu machen, habe ich einfach folgendes gemacht:
in gdb
%Vor%Negative Null ist ein nützliches Konzept für das numerische Rechnen und ist eine gültige Gleitkommazahl in C.
Dies ist ein bekanntes Problem mit printf
. Da Sie eine Gleitkommazahl verwenden, ist keine binäre Darstellung möglich. Und meistens ist die Binärdarstellung nicht perfekt. Also wird 0 manchmal als 0.00000000000000...0042
und als -0.000000000000000000000123
gespeichert. Wenn printf den zweiten druckt, erhalten Sie die ungeraden -0.
Ich weiß nicht wirklich, wie Sie mit 0 vergleichen, denken Sie daran, ein Epsilon hinzuzufügen, wenn Sie Fließkomma-Vergleiche durchführen, um sich auf Kuriositäten einzustellen. Zum Beispiel: um zu testen, ob zwei Gleitkommazahlen gleich sind, schreibe niemals a == b
, aber fabs(a-b) < 1e-13
, wobei 1e-13 das Epsilon ist (wähle einen Exponenten, der zu dir passt).
Wenn man das Buch "Schreiben von großartigem Code, Band 1" in Kapitel 4 liest, gibt der Autor die Antwort ganz klar, weil es ein 1-Komplement ist, um den signierten Float im IEEE FP Standard darzustellen. Er sagt:
Die Mantisse verwendet ein Zweierkomplement anstelle eines Zweierkomplements. Dies bedeutet, dass der 24-Bit-Wert der Mantisse einfach eine vorzeichenlose Binärzahl ist und das Vorzeichenbit in der Bitposition 31 bestimmt, ob dieser Wert positiv oder negativ ist. Einerkomplementzahlen haben die ungewöhnliche Eigenschaft , dass es zwei Repräsentationen für null gibt (wobei das Vorzeichenbit gesetzt oder gelöscht ist) . Im Allgemeinen ist dies nur für die Person wichtig, die das Fließkomma-Software- oder Hardwaresystem entwickelt.
Hervorhebung von mir