[英]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
。
現在,在我繼續將所有這些替換為各自的結果(上面的示例為1000d
, 90000d
, 1500d
)之前,我想弄清楚是否有任何1500d
的理由來保持原始符號?
我想到的唯一一件事就是保持代碼與建模公式的相似性。 還有其他原因我看不到嗎?
它基本上都是關於可讀性的。 在處理時間時,您會更常見到這種代碼樣式,例如:
Thread.sleep(5 * 60 * 1000);
這種風格使線程更加明顯地睡了5分鍾。 在處理數學公式時,通常會保持公式的每個值都保持不變,因此顯而易見的是使用了哪個公式並且正確使用了公式。
程序員喜歡為了可讀性而長時間地寫出東西:例如,知道在正常的一天有86400秒確實屬於酒吧測驗的參與者,而不是程序員。
但是那樣說,我傾向於不使用Math.pow
。
主要原因是它可能不是編譯時可評估的常量表達式 ,盡管這可能取決於編譯器。
您可能會發現pow(x, y)
實現為exp(y log x)
:由於浮點double
僅精確到15左右,因此可以“關閉” x
和y
令人驚訝的微不足道的值圖。
(目前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.