簡體   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