2016-05-02 16 views
0
public static float sqrt(float x) { 
    float xhalf = 0.5f*x; 
    int i = Float.floatToIntBits(x); 
    i = 0x5f3759df - (i>>1); 
    x = Float.intBitsToFloat(i); <----- EDIT: x is modified here (smh) 
    x = x*(1.5f - xhalf*x*x); 
    return x*2; 
} 

public static float sqrtWITHOUTXHALF(float x) { 
    int i = Float.floatToIntBits(x); 
    i = 0x5f3759df - (i>>1); 
    x = Float.intBitsToFloat(i); 
    x = x*(1.5f - (x/2)*x*x); // <---- replaced with parens 
    return x*2; 
} 

Zum Beispiel ist die sqrt (2) für die Spitze 1,4139, während die zweite 1,8855 ist.Warum ändert das Entfernen dieses ersten Teils die Antwort? - (umgekehrte Quadratwurzel, Java)

Warum sollte Ersetzen der xhalf Variable mit entweder (x/2) oder (x * 0,5f), der sich ergebende Wert ändern?

EDIT: WOW, das war sehr dumm von mir für das nicht zu sehen. Ich werde das aber nicht löschen, Seufzer.

+1

Es ist nicht die einzige Änderung. xhalf wird nicht durch die Operation auf i modifiziert, wo x/2 – Richard

+0

Es könnte einfach die Reihenfolge der mathematischen Operationen sein, bei einer Schätzung. – ManoDestra

+1

Aus dem einfachen Grund ist die xhalf in der ersten Methode nicht gleich x/2 in der zweiten Methode. Die mathematischen Operationen, die Sie ausführen, sind sehr unterschiedlich. So einfach ist das. – e4c5

Antwort

1

Sie müssen die erste ändern wie folgt aussehen

public static float sqrt(float x) { 
    int i = Float.floatToIntBits(x); //initialize i 
    i = 0x5f3759df - (i>>1); 
    x = Float.intBitsToFloat(i); //modify x 
    float xhalf = 0.5f*x; //then initialize xhalf 
    x = x*(1.5f - xhalf*x*x); 
    return x*2; 

}

Es 1,8855 produziert (1,8855 erhalten), so dass beide jetzt das Gleiche produzieren. Das ist jedoch die falsche Antwort. Das ist der Grund, warum du unterschiedliche Ergebnisse bekommen hast.

UPDATE: Wenn Sie möchten, dass die zweite das korrekte Ergebnis liefert, können Sie x in eine Temp-Variable speichern. Gefällt Ihnen dieses

public static float sqrtWITHOUTXHALF(float x) { 
    float _x = x; 
    int i = Float.floatToIntBits(x); 
    i = 0x5f3759df - (i>>1); 
    x = Float.intBitsToFloat(i); 
    x = x*(1.5f - (_x/2)*x*x); // <---- replaced with parens 
    return x*2; 

}

Nun ist die neue Variable _x ist un verändert und das richtige Ergebnis.

+0

Was ist der Grund obwohl? – ManoDestra

+0

Der Grund, warum es das falsche Ergebnis erzeugt? Oder der Grund, warum ich das getan habe? – sbowde4

+1

Der Grund, warum das Verschieben der Linie einen Unterschied macht. EDIT: Vergiss es. Ich sehe es. x wird nach dem ersten Setzen von xhalf geändert :) – ManoDestra