如何在Java中实现“快速逆平方根”?

恶作剧:

我听说过这里讨论过的“快速逆平方根”,我想将其放入我的Java程序中(仅出于研究目的,因此请忽略有关本机库更快的任何内容)。

我在看代码,C代码直接将C转换floatint带有C指针魔术的。如果尝试使用强制转换在Java中执行此操作,那么它将无法正常工作:java会截断浮点数(如您所愿),并且您将无法获取基元的指针(就像在C语言中一样)。那你怎么做呢?

恶作剧:

记住在使用此代码之前对您的代码进行基准测试。

如果事实证明您不需要它,或者您使用的CPU架构速度较慢,那么最好不要在项目中使用这些晦涩的代码。


Java库提供了一种从浮点数到原始位的方法。

如Javadoc中的java.lang.Floathttp://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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章