2016-08-01 96 views
16

Wie lautet die Invertierbarkeit der IEEE 754 Gleitkommadivision? Ich meine, ist es durch den Standard garantiert, dass, wenn double y = 1.0/x dann x == 1.0/y, d. H. x genau Stück für Stück wiederhergestellt werden kann?Invertierbarkeit der IEEE 754 Gleitkommadivision

Die Fälle, wenn y ist infinity oder NaN sind offensichtliche Ausnahmen.

+4

Es gibt offensichtliche Fälle, in denen es kann nicht, wie unendlich und unbestimmt, und möglicherweise denormalisierte Zahlen auch. Aber es ist eine gute Frage für den Rest. –

+2

Es scheint, als würde dies für Null und Unendlich gut funktionieren ... –

+0

Durch einfaches Gegenbeispiel kann man zeigen, dass ein IEEE-754-konformer Gleitkomma-Reziprok nicht auf diese Weise zurückgesetzt werden kann. Verwenden Sie zum Beispiel den Rundungsmodus to-nearest-or-even mit 'binary32':' x = 0x1.fffffep-1: 1.0f/x = 0x1.000002p + 0 1.0f/(1.0f/x) = 0x1. fffffcp-1' und mit 'binary64':' x = 0x1.fffffffffffffp-1: 1.0f/x = 0x1.0000000000001p + 0 1.0f/(1.0f/x) = 0x1.ffffffffffffep-1' – njuffa

Antwort

13

Ja, es gibt IEEE 754 doppelt genaue (*) Werte x, die x != 1.0/(1.0/x) sind.

Es ist einfach ein Beispiel für einen Normalwert mit dieser Eigenschaft von Hand zu bauen: die, die 0x1.fffffffffffffp0 in C99's hexadecimal notation for floating-point values geschrieben ist, so dass 1.0/(1.0/0x1.fffffffffffffp0) == 0x1.ffffffffffffep0. Es war natürlich zu erwarten, dass 0x1.fffffffffffffp0 ein Gegenbeispiel ist, weil 1.0/0x1.fffffffffffffp0 auf den Anfang einer Binade fällt, wo Gleitkommazahlen weniger dicht sind, so dass ein größerer relativer Fehler in der innersten Division passieren musste. Genauer gesagt fällt 1.0/0x1.fffffffffffffp0 knapp über den Mittelpunkt zwischen 0.5 und seinem Double-Precision-Nachfolger, so dass 1.0/0x1.fffffffffffffp0 auf den Nachfolger von 0,5 aufgerundet wird, mit einem großen relativen Fehler.

In dezimal %.16e Format, 0x1.fffffffffffffp0 ist 1.9999999999999998e+00 und 0x1.ffffffffffffep0 ist 1.9999999999999996e+00.

(*) gibt es keinen Grund für die Umkehrfunktion die Eigenschaft in der Frage für eine des IEEE 754-Format haben

+7

Ein Spaß und leicht bewiesene Tatsache hier ist, dass (unter der Annahme, Überlauf und Unterlauf vermieden werden, ein Binärformat IEEE 754, rund-halb-zu-gerade, etc.), jedes float 'x', deren Bruchteil im Bereich '[1.0 , sqrt (2)] 'besitzt die Eigenschaft' 1.0/(1.0/x) == x'. –

-3

Offensichtlich nicht. 1/10 hat keine Darstellung. Sie erhalten stattdessen eine Annäherung. Invertieren, das gibt Ihnen nicht 10.

Edit: es gibt eine große Anzahl von diesen. Jede Umkehrung, die mehr als 53 Bits erfordert, wird einer davon sein.

Es gibt einen einfachen Test. In C könnten Sie 1.0/(1.0/10.0) gegen 10.0 testen und Sie werden feststellen, dass sie nicht gleich sind.

+2

Dies ist nicht wahr: http://coliru.stacked-crooked.com/a/c1c76fcf94b68e68 – plasmacel

+0

Was ist nicht wahr? Dass 0.1 nicht dargestellt werden kann oder dass das Invertieren dessen, was kein 0.1 ist, nicht 10 ergibt? Wie würde ein Gerät wissen, dass (1/10) -eps 1/10 und nicht die Approximation sein soll? – DAV

+0

Also was wird invertieren 1/10 geben? –