当前位置: 首页 > 面试题库 >

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

诸葛立果
2023-03-14
问题内容

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

我在看代码,C代码直接将C转换floatint带有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的C ++库也可能会有所帮助。 谢谢! 更新:决定切换到OpenCV,现在正在寻找使用它制作屏幕截图的方法:) 问题答案: 你绝对应该对OpenCV

  • 问题内容: 是否有一些模板或某些东西可以通过访问包装成员来实现iterface方法? 例如,假设我有 现在我想通过传递调用来实现 等等。 问题答案: 有。使用源菜单->生成代表方法…

  • 问题 你想快速计算某数的平方根倒数。 解决方案 在 Quake Ⅲ Arena 的源代码中,这个奇怪的算法对一个幻数进行整数运算,来计算平方根倒数的浮点近似值。 在 CoffeeScript 中,他使用经典原始的变量,以及由 Chris Lomont 发现的新的最优 32 位幻数。除此之外,还使用 64 位大小的幻数。 另一特征是可以通过控制牛顿迭代法的迭代次数来改变其精确度。 相比于传统的,该算

  • 本文向大家介绍java实现快速排序算法,包括了java实现快速排序算法的使用技巧和注意事项,需要的朋友参考一下 1、算法概念。 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。 2、算法思想。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序

  • js中如何实现快速排序?guolguul都不会放

  • 问题内容: 这是我的问题:我有一个对话框,其中包含一些用户可以更改的参数(例如,通过微调器)。每次更改这些参数之一时,我都会启动一个线程以根据新的参数值更新3D视图。如果在第一个线程正在工作时用户更改了另一个值(或通过单击微调箭头多次再次更改了相同的值),我想中止第一个线程(以及3D视图的更新)并启动一个新线程具有最新的参数值。 我该怎么做? PS:我的线程的方法中没有循环,因此检查标志不是一个选