Ist für jeden endlichen Gleitkommawert garantiert, dass x - x == 0?

8

Gleitkommawerte sind ungenau, weshalb wir in Vergleichen nur selten strenge numerische Gleichheit verwenden sollten. In Java beispielsweise wird false ( wie auf ideone.com ) angezeigt:

%Vor%

Normalerweise ist es der richtige Weg, um Ergebnisse von Gleitkommaberechnungen zu vergleichen, um zu sehen, ob die absolute Differenz gegenüber einem erwarteten Wert geringer ist als die tolerierte Epsilon .

%Vor%

Die Frage ist, ob einige -Operationen genaue Ergebnisse liefern können. Wir wissen, dass für jeden nicht-endlichen Gleitkommawert x (dh entweder NaN oder eine Unendlichkeit) x - x IMMER NaN .

Aber wenn x endlich ist, ist das garantiert?

  1. x * -1 == -x
  2. x - x == 0
  

(Ich bin insbesondere an Java-Verhalten interessiert, aber auch Diskussionen für andere Sprachen sind willkommen.)

Für was es wert ist, denke ich (und ich kann hier falsch liegen) ist die Antwort JA! Ich denke, es läuft darauf hinaus, ob für ein endliches IEEE-754 Fließkommazahl, ihre additive Inverse ist immer genau berechenbar. Da z.B. float und double hat ein dediziertes Bit nur für das Zeichen , dies scheint der Fall zu sein es muss nur das Vorzeichen-Bit umgedreht werden, um das additive Inverse zu finden (dh der significand sollte intakt bleiben).

>

Verwandte Fragen

polygenelubricants 30.08.2010, 10:35
quelle

2 Antworten

2

Obwohl x - x Ihnen -0 und nicht 0 geben kann, wird -0 genauso groß wie 0 , so dass Sie mit Ihrer Annahme sicher sind, dass jede endliche Zahl minus sich selbst mit Null vergleichen wird .

Siehe Gibt es einen Fließkommawert von x, für den xx == 0 ist falsch? für weitere Details.

    
Gabe 30.08.2010, 12:32
quelle
3

Beide Gleichheiten sind mit Gleitkommazahl IEEE 754 garantiert, da die Ergebnisse von x-x und x * -1 genau wie Gleitkommazahlen mit der gleichen Genauigkeit wie x dargestellt werden können. In diesem Fall müssen die genauen Werte unabhängig vom Rundungsmodus von einer kompatiblen Implementierung zurückgegeben werden.

EDIT: Vergleiche mit dem Beispiel .1 + .2 .

Sie können in IEEE 754 .1 und .2 nicht hinzufügen, da Sie sie nicht so darstellen können, dass sie an + übergeben werden. Addition, Subtraktion, Multiplikation, Division und Quadratwurzel geben den eindeutigen Gleitkommawert zurück, der, abhängig vom Rundungsmodus, unmittelbar unterhalb, unmittelbar darüber liegt, am nächsten zu einer Regel für die Behandlung von Bindungen, ..., dem Ergebnis der Operation an die gleichen Argumente in R . Wenn das Ergebnis (in R ) zufällig als Fließkommazahl dargestellt werden kann, ist diese Zahl automatisch das Ergebnis, unabhängig vom Rundungsmodus.

Die Tatsache, dass Ihr Compiler Sie 0.1 als Abkürzung für eine andere, darstellbare Zahl ohne Warnung schreiben kann, ist orthogonal zur Definition dieser Operationen. Wenn Sie beispielsweise - (0.1) schreiben, ist - genau: es gibt genau das Gegenteil seines Arguments zurück. Auf der anderen Seite ist das Argument nicht 0.1 , sondern das double , das der Compiler an seiner Stelle verwendet.

Kurz gesagt, ein weiterer Grund, warum die Operation x * (-1) genau ist, ist, dass -1 als double dargestellt werden kann.

    
Pascal Cuoq 30.08.2010 10:38
quelle