簡體   English   中英

更快地實現Math.round?

[英]Faster implementation of Math.round?

這段代碼是否有任何缺點,這似乎是java.lang.Math.round的更快(和更正確)的版本?

public static long round(double d) {

    if (d > 0) {
        return (long) (d + 0.5d);
    } else {
        return (long) (d - 0.5d);
    }
}

它利用了這樣一個事實,即在Java中,截斷到長輪到零。

內置方法處理的一些特殊情況 ,代碼無法處理。 從文檔:

  • 如果參數為NaN ,則結果為0。
  • 如果參數為負無窮大或任何小於或等於Integer.MIN_VALUE值的值,則結果等於Integer.MIN_VALUE的值。
  • 如果參數為正無窮大或任何大於或等於Integer.MAX_VALUE值的值,則結果等於Integer.MAX_VALUE的值。

我一直在測試這個,有一個關鍵的潛在缺點,這里還沒有描述:你正在改變舍入打破平局的方法。

Math.round()實現了“round half up”規則,而round()方法實現了“round round of zero”規則。

例如:

  • Math.round(-0.5d) => 0L
  • Your.round(-0.5d) => -1L

這對您來說可能是也可能不是問題,但您應該理解上述方法不是Math.round()替代品,即使已經概述了NaN和無窮大的考慮因素。

另一個相關問題: 在Java中舍入負數

至於性能,毫無疑問,上述方法明顯快於Math.round() - 它在大約35%的時間內運行,用於隨機生成的正值和負值。 在緊密循環中調用此方法時,這可能是一個值得優化的。 當僅給出正值時,它甚至更好(運行時的25%),可能是因為CPU使用分支預測

Math.round()最終由本機JNI調用實現,這可能是性能差異的原因。 這個Sun / Oracle漏洞表明在j6u22中可能有純Java版本,但是我無法看到j6u23中的Math.round()在我的測試中與j6u16類似。 我沒有在其他版本上測試過。

是; 你沒有考慮下溢或溢出。 從語用上講,這對您的申請可能無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM