为什么删除第一部分会改变答案? - (反平方根,java)

时间:2016-05-02 03:43:45

标签: java math return inverse square-root

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因为没有看到这一点而非常愚蠢。我不打算删除它,叹了口气。

1 个答案:

答案 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未被修改,将产生正确的结果。