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, что было очень глупо от меня, потому что я не видел этого. Я не собираюсь это удалять, вздохнув.
Это не единственная модификация. xhalf не модифицируется операцией на i, где x/2 делает – Richard
Это может быть просто порядок математических операций, по предположению. – ManoDestra
По простой причине xhalf в первом методе не равен x/2 во втором. Математические операции, которые вы выполняете, очень разные. Это просто. – e4c5