日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

为什么java单精度要f_为什么快速反平方根如此奇怪和慢Java?

發(fā)布時間:2025/3/20 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么java单精度要f_为什么快速反平方根如此奇怪和慢Java? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我試圖在

java上實現(xiàn)

Fast Inverse Square Root,以加速向量規(guī)范化.然而,當我在Java中實現(xiàn)單精度版本時,我首先得到與1F /(float)Math.sqrt()相同的速度,然后快速下降到一半的速度.這是有趣的,因為當Math.sqrt使用(我推測)一個本地方法時,這涉及浮點除法,我聽說的很慢.我的代碼用于計算數(shù)字如下:

public static float fastInverseSquareRoot(float x){

float xHalf = 0.5F * x;

int temp = Float.floatToRawIntBits(x);

temp = 0x5F3759DF - (temp >> 1);

float newX = Float.intBitsToFloat(temp);

newX = newX * (1.5F - xHalf * newX * newX);

return newX;

}

使用我編寫的一個簡短的程序來迭代每1600萬次,然后聚合結(jié)果,并重復,我得到如下結(jié)果:

1F / Math.sqrt() took 65209490 nanoseconds.

Fast Inverse Square Root took 65456128 nanoseconds.

Fast Inverse Square Root was 0.378224 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 64131293 nanoseconds.

Fast Inverse Square Root took 26214534 nanoseconds.

Fast Inverse Square Root was 59.123647 percent faster than 1F / Math.sqrt()

1F / Math.sqrt() took 27312205 nanoseconds.

Fast Inverse Square Root took 56234714 nanoseconds.

Fast Inverse Square Root was 105.895914 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 26493281 nanoseconds.

Fast Inverse Square Root took 56004783 nanoseconds.

Fast Inverse Square Root was 111.392402 percent slower than 1F / Math.sqrt()

我一直得到兩者的速度大致相同的數(shù)字,隨后是一個迭代,其中快速逆平方根保存了1F / Math.sqrt()所需的大約60%的時間,然后是幾次迭代,大約是兩次快速反向平方根作為控件運行.我很困惑為什么FISR會從Same – >快60% – >每次運行我的程序都會慢100%.

編輯:以上數(shù)據(jù)是在eclipse中運行的.當我用javac / java運行程序時,我得到完全不同的數(shù)據(jù):

1F / Math.sqrt() took 57870498 nanoseconds.

Fast Inverse Square Root took 88206794 nanoseconds.

Fast Inverse Square Root was 52.421004 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 54982400 nanoseconds.

Fast Inverse Square Root took 83777562 nanoseconds.

Fast Inverse Square Root was 52.371599 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 21115822 nanoseconds.

Fast Inverse Square Root took 76705152 nanoseconds.

Fast Inverse Square Root was 263.259133 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 20159210 nanoseconds.

Fast Inverse Square Root took 80745616 nanoseconds.

Fast Inverse Square Root was 300.539585 percent slower than 1F / Math.sqrt()

1F / Math.sqrt() took 21814675 nanoseconds.

Fast Inverse Square Root took 85261648 nanoseconds.

Fast Inverse Square Root was 290.845374 percent slower than 1F / Math.sqrt()

編輯2:經(jīng)過幾次回應,好像幾次迭代后速度穩(wěn)定下來,但穩(wěn)定的數(shù)字是非常不穩(wěn)定的.任何人都知道為什么?

這是我的代碼(不完全簡潔,但這里是整個事情):

public class FastInverseSquareRootTest {

public static FastInverseSquareRootTest conductTest() {

float result = 0F;

long startTime, endTime, midTime;

startTime = System.nanoTime();

for (float x = 1F; x < 4_000_000F; x += 0.25F) {

result = 1F / (float) Math.sqrt(x);

}

midTime = System.nanoTime();

for (float x = 1F; x < 4_000_000F; x += 0.25F) {

result = fastInverseSquareRoot(x);

}

endTime = System.nanoTime();

return new FastInverseSquareRootTest(midTime - startTime, endTime

- midTime);

}

public static float fastInverseSquareRoot(float x) {

float xHalf = 0.5F * x;

int temp = Float.floatToRawIntBits(x);

temp = 0x5F3759DF - (temp >> 1);

float newX = Float.intBitsToFloat(temp);

newX = newX * (1.5F - xHalf * newX * newX);

return newX;

}

public static void main(String[] args) throws Exception {

for (int i = 0; i < 7; i++) {

System.out.println(conductTest().toString());

}

}

private long controlDiff;

private long experimentalDiff;

private double percentError;

public FastInverseSquareRootTest(long controlDiff, long experimentalDiff) {

this.experimentalDiff = experimentalDiff;

this.controlDiff = controlDiff;

this.percentError = 100D * (experimentalDiff - controlDiff)

/ controlDiff;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

sb.append(String.format("1F / Math.sqrt() took %d nanoseconds.%n",

controlDiff));

sb.append(String.format(

"Fast Inverse Square Root took %d nanoseconds.%n",

experimentalDiff));

sb.append(String

.format("Fast Inverse Square Root was %f percent %s than 1F / Math.sqrt()%n",

Math.abs(percentError), percentError > 0D ? "slower"

: "faster"));

return sb.toString();

}

}

總結(jié)

以上是生活随笔為你收集整理的为什么java单精度要f_为什么快速反平方根如此奇怪和慢Java?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。