2016-05-02 7 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; 
} 

Например, sqrt (2) для верха 1.4139, а второй - 1,8855.Почему удаление этой первой части меняет ответ? - (обратный квадратный корень, java)

Зачем заменять переменную xhalf на EITHER (x/2) или (x * 0,5f), изменить результирующее значение?

EDIT: WOW, что было очень глупо от меня, потому что я не видел этого. Я не собираюсь это удалять, вздохнув.

+1

Это не единственная модификация. xhalf не модифицируется операцией на i, где x/2 делает – Richard

+0

Это может быть просто порядок математических операций, по предположению. – ManoDestra

+1

По простой причине xhalf в первом методе не равен x/2 во втором. Математические операции, которые вы выполняете, очень разные. Это просто. – e4c5

ответ

1

Вы должны изменить первый, чтобы выглядеть следующим образом (чтобы получить 1.8855)

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; 

}

Это произвело 1.8855, так как в настоящее время производят то же самое. Однако это неправильный ответ. Вот почему вы получили разные результаты.

UPDATE: Если вы хотите, чтобы второй выдавал правильный результат, вы можете сохранить x переменной темпа. Как это

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; 

}

Теперь новая переменная _x ООН является модифицирована и будет производить правильный результат.

+0

В чем причина? – ManoDestra

+0

Причина, по которой он производит неверный результат? Или почему я это сделал? – sbowde4

+1

Причина, по которой перемещение линии имеет значение. EDIT: забудьте об этом. Вижу. x изменяется после установки xhalf изначально :) – ManoDestra