需要帮助将代码从C翻译成Java吗
来自文章。代码如下:需要帮助将代码从C翻译成Java吗,java,c,translation,Java,C,Translation,来自文章。代码如下: float InvSqrt(float x){ // line 0 float xhalf = 0.5f * x; int i = *(int*)&x; // store floating-point bits in integer i = 0x5f3759d5 - (i >> 1); // initial guess for Newton's method x = *(float*)&i; // convert new
float InvSqrt(float x){ // line 0
float xhalf = 0.5f * x;
int i = *(int*)&x; // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1); // initial guess for Newton's method
x = *(float*)&i; // convert new bits into float
x = x*(1.5f - xhalf*x*x); // One round of Newton's method
return x;
}
我甚至不能分辨这是C还是C++。[好的,显然是C,谢谢]有人能帮我把它翻译成Java吗?(我希望只有)第2行和第4行让我感到困惑。您引用的代码是C,尽管注释是C++风格的 代码所做的工作涉及在位级别存储浮点值的方式。“幻数”
0x5f3759d5
与特定值有关
初始化i
时访问浮点x
值的位,因为x
的地址被取消引用。因此,i
加载浮点值的前32位。在下一行,x
被写入i
的内容,更新工作近似值
我已经读到,当John Carmack使用Id的开源地震引擎发布该代码时,该代码变得流行起来。该代码的目的是快速计算1/Sqrt(x),用于图形引擎的照明计算
我无法将这段代码直接翻译成Java,因为它使用了如上所述的“类型双关法”——当它像访问int一样访问内存中的float时。Java阻止了这种活动,但正如其他人所指出的,float对象提供了围绕它的方法
在C中使用这个奇怪的实现的目的是为了让它非常快。在编写时,我认为这种方法有了很大的改进。我想知道,在浮点运算速度越来越快的今天,这种差异是否值得
使用Java方法将浮点转换为整数位并返回可能比直接使用Java数学函数求平方根求逆要慢。您引用的代码是C,尽管注释是C++风格的 代码所做的工作涉及在位级别存储浮点值的方式。“幻数”
0x5f3759d5
与特定值有关
初始化i
时访问浮点x
值的位,因为x
的地址被取消引用。因此,i
加载浮点值的前32位。在下一行,x
被写入i
的内容,更新工作近似值
我已经读到,当John Carmack使用Id的开源地震引擎发布该代码时,该代码变得流行起来。该代码的目的是快速计算1/Sqrt(x),用于图形引擎的照明计算
我无法将这段代码直接翻译成Java,因为它使用了如上所述的“类型双关法”——当它像访问int一样访问内存中的float时。Java阻止了这种活动,但正如其他人所指出的,float对象提供了围绕它的方法
在C中使用这个奇怪的实现的目的是为了让它非常快。在编写时,我认为这种方法有了很大的改进。我想知道,在浮点运算速度越来越快的今天,这种差异是否值得
使用Java方法将浮点转换为整数位并返回可能比直接使用Java math函数计算平方根的逆平方根要慢。要使用以下方法:
strictfp
等问题
大致是这样的:(注意:这是未经测试的!)
您要使用以下方法:
strictfp
等问题
大致是这样的:(注意:这是未经测试的!)
这些行用于在
float
和int
之间转换为位模式。Java在Java.lang.Float
中有静态方法,其他方法都是相同的
static float InvSqrt(float x) { // line 0
float xhalf = 0.5f * x;
int i = Float.floatToIntBits(x); // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1); // initial guess for Newton's method
x = Float.intBitsToFloat(i); // convert new bits into float
x = x * (1.5f - xhalf * x * x); // One round of Newton's method
return x;
}
这些行用于在
float
和int
之间转换为位模式。Java在Java.lang.Float
中有静态方法,其他方法都是相同的
static float InvSqrt(float x) { // line 0
float xhalf = 0.5f * x;
int i = Float.floatToIntBits(x); // store floating-point bits in integer
i = 0x5f3759d5 - (i >> 1); // initial guess for Newton's method
x = Float.intBitsToFloat(i); // convert new bits into float
x = x * (1.5f - xhalf * x * x); // One round of Newton's method
return x;
}
你关心的台词很简单。第2行获取浮点
x
中的字节,这些字节采用某些浮点表示形式,如IEEE754,并以整数形式存储它们,与它们的存储方式完全相同。这将导致一个完全不同的数字,因为整数和浮点数以字节形式表示。第4行正好相反,将int中的字节再次传输到float中您关心的行非常简单。第2行获取浮点x
中的字节,这些字节采用某些浮点表示形式,如IEEE754,并以整数形式存储它们,与它们的存储方式完全相同。这将导致一个完全不同的数字,因为整数和浮点数以字节形式表示。第4行做的正好相反,将int中的字节再次传输到float中,好的,我在这里有点冒险,因为我懂C,但不懂Java
用Java重写这段C代码简直是自找麻烦。
即使在C语言中,代码也是不可移植的。
除此之外,它还依赖于:
浮点数的大小。
整数的大小。
浮点数的内部表示形式。
浮点数和整数的字节对齐方式。
使用逻辑右移实现右移(即i>>1)
与算术右移相反(在1上移动
具有高阶1位的整数,因此不再等于除法
按2)
我知道Java编译成字节码,而不是直接编译成字节码
机器代码。字节码解释器的实现者使用
基于字节码规范的假设和理解
关于th的输出