Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助将代码从C翻译成Java吗_Java_C_Translation - Fatal编程技术网

需要帮助将代码从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的输出