2015-01-29 12 views
5

Sie haben 2 Funktionen;Fließpunkt; Division vs Multiplikation

f(x)= x(((x+1)^(1/2))-(x^(1/2)))  
g(x)= x/(((x+1)^(1/2))+(x^(1/2))) 

Welcher ist genauer?

Seitennotiz: Wenn Sie erklären könnten, warum das mir wirklich helfen würde, habe ich das Gefühl, es ist f (x), da es keinen Nenner gibt, aber ich bin nicht 100% sicher.

+1

Waaaay Off-Topic für SO, versuchen Sie [Math.StackExchange] (http://math.stackexchange.com/) stattdessen. –

+0

Hallo Claire, StackExchange ist in mehrere Seiten aufgeteilt, die sich auf verschiedene Themen konzentrieren. Einer von ihnen ist [Mathematik] (http://math.stackexchange.com/). Sie sollten Ihre Frage dort stellen. – Stefan

+0

Danke Leute, ich werde genau das tun –

Antwort

5

Die Gleitkommaarithmetik unterscheidet sich ziemlich von der echten Mathematik. Insbesondere ist Gleitkommaarithmetik nicht assoziativ oder distributiv. Daher sind mathematisch äquivalente Ausdrücke nicht notwendigerweise äquivalent, wenn sie mit Gleitkommaarithmetik mit endlicher Genauigkeit ausgewertet werden. Dies ist auch dann der Fall, wenn einzelne Operationen wie Addition, Subtraktion, Multiplikation, Division und Quadratwurzel korrekt gerundete Ergebnisse liefern, wie von der IEEE-754 floating-point standard gefordert.

In diesem Fall g() wird im Durchschnitt viel genauer sein als f() und auch für den speziellen Fall von x = 500. Der Grund dafür ist, dass f() an subtraktiver Löschung leidet. Dies geschieht während der effektiven Subtraktion von zwei Gleitkommazahlen, deren Größe nahezu identisch ist. Die führenden Ziffern werden während der Subtraktion gelöscht, so dass nur noch wenige nachlaufende Ziffern übrigbleiben, die in die nachfolgende Berechnung eingehen. Außerdem kann jeder Rundungsfehler, der in den nachlaufenden Ziffern der ursprünglichen Operanden, die subtrahiert werden, akkumuliert wird, durch nachfolgende Berechnung vergrößert werden. Eine erweiterte Erläuterung mit Beispiel findet sich in this Wikipedia article.

In diesem Fall sind sqrt(x+1) und sqrt(x) fast die gleiche Größenordnung, insbesondere wenn die Größe x steigt. Am Beispiel der x = 500 und IEEE-754 mit einfacher Genauigkeit Arithmetik verwendet wird, so finden wir:

x = 500 f(x) = 0x1.659ae0p+3 (11.175156) reference = 0x1.659798p+3 (11.174755) 
x = 500 g(x) = 0x1.659798p+3 (11.174755) reference = 0x1.659798p+3 (11.174755) 

Der Fehler in ist, während die g(500) einfache Genauigkeit Ergebnis korrekt gerundet liefert.

+0

Gibt es aus Neugierde Werte, für die "f" genauer ist? Nicht nur "im Durchschnitt"? – Teepeemm

+0

OT: Seltsam, dass meine Antwort automatisch zu einem Community-Wiki wurde. @Teepeemm: Ja, von einer flüchtigen Überprüfung mit zufälligen IEEE-754-Einzelpräzisionsargumenten existieren zahlreiche solcher Fälle. Zum Beispiel: 'x = 0x1.6fa276p-2 (3.59018177e-1); f (x) = 0x1.a09844p-3 (2.03415424e-1); g (x) = 0x1.a09846p-3 (2.03415439e-1); ref = 0x1.a09844p-3 (2.03415425e-1); ulperr (f) = 6,71231e-2; ulperr (g) = 9,32877e-1' – njuffa