gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:58:45 24 4
gpt4 key购买 nike

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。

为什么用 (x/2) 或 (x*0.5f) 替换 xhalf 变量会更改结果值?

编辑:哇,我没有看到这一点真是太愚蠢了。不过我不会删除这个,叹气。

最佳答案

您需要将第一个修改为如下所示(以获得 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未修改,将产生正确的结果。

关于java - 为什么删除第一部分会改变答案? --(平方根倒数,java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36974692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com