math.abs的Java性能问题

use*_*333 2 java math performance matrix data-structures

我正在使用Jama矩阵来执行SVD操作.我有几个关于表现的问题.

我并不担心这么多的准确性,我认为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;
   }
Run Code Online (Sandbox Code Playgroud)

这是我想用这个功能做的事情

   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;
   }
Run Code Online (Sandbox Code Playgroud)

我不知道,如果这是一个好的方式去做.谢谢

Gab*_*abe 6

我希望有一个好的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);
}
Run Code Online (Sandbox Code Playgroud)