繁体   English   中英

math.abs的Java性能问题

[英]Java performance problem for math.abs

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

我并不担心这么多的准确性,我认为double比Float更为准确,对吗? 如果我使用double以外的float,它将提高多少性能并降低精度?

在Jama矩阵中,它使用了一个调用很多的函数,使用了double和Math.abs函数,这需要大量的Heap和CPU。 如果我将其更改为double并删除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);
}

您的方法对否定论点无效。 只需添加:

if (a < 0) a = -a;
if (b < 0) b = -b;

在您的功能开始时,一切都应该很好。 (“不起作用”是指它不会总是以使舍入误差和溢出风险最小化的方式进行计算。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM