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;
}
例如,top的sqrt(2)是1.4139,而第二个是1.8855。
为什么用EITHER(x / 2)或(x * 0.5f)替换xhalf变量,改变结果值?
编辑: WOW因为没有看到这一点而非常愚蠢。我不打算删除它,叹了口气。
答案 0 :(得分: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,所以两者现在产生相同的东西。然而,这是错误的答案。所以这就是你得到不同结果的原因。
<强>更新强> 如果您希望第二个产生正确的结果,您可以将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
未被修改,将产生正确的结果。