gpt4 book ai didi

math.abs 的 Java 性能问题

转载 作者:行者123 更新时间:2023-12-03 01:33:35 27 4
gpt4 key购买 nike

我正在使用Jama matrix执行 SVD 操作。我有几个关于性能的问题。

我并不担心这么多的准确性,而且我认为 double 比 Float 更准确,对吗?如果我使用 float 而不是 double,它会在多大程度上提高性能并降低精度?

在 Jama 矩阵中,它使用了一个调用很多的函数,它使用了 double 和 Math.abs 函数,这需要大量的堆和 CPU。如果我将其更改为双倍并删除 Math.abs,它会对性能和结果的准确性产生多大影响?

这是 Jama 数学函数:

   public static double hypot(double a, double b) {
double r;
if (Math.abs(a) > Math.abs(b)) {
r = b/a;
r = Math.abs(a)*Math.sqrt(1+r*r);
} else if (b != 0) {
r = a/b;
r = Math.abs(b)*Math.sqrt(1+r*r);
} else {
r = 0.0;
}
return r;
}

这是我想用这个函数做什么

   public static float hypot(float a, float b) {
float r;
if (a > b) {
r = b/a;
r = (float) (a*Math.sqrt(1+r*r));
} else if (b != 0) {
r = a/b;
r = (float) (b*Math.sqrt(1+r*r));
} else {
r = 0;
}
return r;
}

我不知道这是否是一个好方法。谢谢

最佳答案

我希望一个好的 JIT 能够将 Math.abs 调用内联到单个指令。如果您的代码在 FPU 上运行(很可能),使用 float 不会为您带来任何速度,因为几乎所有 FPU 都是 64 位或更好。

然而,该算法如此不寻常的原因是,当其操作数的大小约为 10^150 时,它可以防止溢出。如果您正在考虑使用 float,您的操作数的大小不得大于 10^38 左右,这意味着最快的算法将是:

public static double hypot(double a, double b) {
return Math.sqrt(a * a + b * b);
}

关于math.abs 的 Java 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131659/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com