如何在Java中实现“快速逆平方根”?
我听说过这里讨论过的“快速逆平方根”,我想将其放入我的Java程序中(仅出于研究目的,因此请忽略有关本机库更快的任何内容)。
我在看代码,C代码直接将C转换float
为int
带有C指针魔术的。如果尝试使用强制转换在Java中执行此操作,则将无法正常工作:java会截断float(如您所愿),并且您将无法获取基元的指针(如在C中那样)。那你怎么做呢?
回答:
使用此方法之前,请记住先对代码进行基准测试。
如果事实证明您不需要它,或者您使用的CPU架构速度较慢,那么最好不要在项目中使用这些晦涩的代码。
Java库提供了一种从浮点数到原始位的方法。
如Javadoc
java.lang.Float
(http://docs.oracle.com/javase/6/docs/api/java/lang/Float.html)所示,我们具有的floatToIntBits
功能,以及intBitsToFloat
。
这意味着我们可以用Java编写“快速反平方根”,如下所示:
public static float invSqrt(float x) { float xhalf = 0.5f * x;
int i = Float.floatToIntBits(x);
i = 0x5f3759df - (i >> 1);
x = Float.intBitsToFloat(i);
x *= (1.5f - xhalf * x * x);
return x;
}
这是双打的版本:
public static double invSqrt(double x) { double xhalf = 0.5d * x;
long i = Double.doubleToLongBits(x);
i = 0x5fe6ec85e7de30daL - (i >> 1);
x = Double.longBitsToDouble(i);
x *= (1.5d - xhalf * x * x);
return x;
}
来源:http://www.actionscript.org/forums/showthread.php3?
t = 142537
以上是 如何在Java中实现“快速逆平方根”? 的全部内容, 来源链接: utcz.com/qa/412298.html