簡體   English   中英

有沒有理由使用Math.pow()與文字而不是結果本身?

[英]Is there any reason to use Math.pow() with literals rather than the result itself?

我目前正在查看現有代碼。 編寫現有公式的方法有很多種。 我偶然發現了幾十個代碼實例,如Math.pow(10.0D, 3.0D)Math.pow(300.0D, 2.0D)以及類似1.5D * 1000.0D

現在,在我繼續將所有這些替換為各自的結果(上面的示例為1000d90000d1500d )之前,我想弄清楚是否有任何1500d的理由來保持原始符號?

我想到的唯一一件事就是保持代碼與建模公式的相似性。 還有其他原因我看不到嗎?

它基本上都是關於可讀性的。 在處理時間時,您會更常見到這種代碼樣式,例如:

Thread.sleep(5 * 60 * 1000);

這種風格使線程更加明顯地睡了5分鍾。 在處理數學公式時,通常會保持公式的每個值都保持不變,因此顯而易見的是使用了哪個公式並且正確使用了公式。

程序員喜歡為了可讀性而長時間地寫出東西:例如,知道在正常的一天有86400秒確實屬於酒吧測驗的參與者,而不是程序員。

但是那樣說,我傾向於使用Math.pow

主要原因是它可能不是編譯時可評估的常量表達式 ,盡管這可能取決於編譯器。

您可能會發現pow(x, y)實現為exp(y log x) :由於浮點double僅精確到15左右,因此可以“關閉” xy令人驚訝的微不足道的值圖。

(目前JLS只指定了一個Math.pow兩個double參數的Math.pow函數。如果你要使用整數文字,那么編譯器會在調用函數之前自動將它們轉換為double類型。看來作者正在使用double文字防止將來引入Math.pow超載的可能性。)

在您的特定情況下,我會考慮將Math.pow(300.0D, 2.0D)替換為300.0 * 300.0 ,將Math.pow(10.0D, 3.0D)替換為10.0 * 10.0 * 10.0 但請檢查這些值是否與原始值相同; 並仔細調查任何差異的影響。

它可以更容易驗證公式是否已正確轉換為代碼。 還要考慮是否應該用命名常量替換其中一些數字文字,以進一步提高可讀性。 在不了解背景的情況下,它看起來很多“神奇的數字”。

暫無
暫無

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

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