我剛剛開始分析一個應用程序,它執行一些log linear
插值,並且當互相調用Math.log
和Math.exp
時,我發現有些奇怪。該行爲可以重現方式如下:調用java.lang.Math.log沒有通過調試模式在Eclipse中的方法
public class TestLogExp {
public static void main(String[] args) {
Double thisdouble = 0d;
thisdouble = Math.log(Math.exp(10));
System.out.println(thisdouble);
}
}
現在我們清楚地看到,Math.log
和Math.exp
這是主要的方法中調用。但是,當我在Math.exp
和Math.log
(它們只是調用StrictMath
native statics
)中都放置斷點時,執行只會在Math.exp
而不是Math.log
中中斷。
現在我認爲它可能是java
不會調用靜態方法調用內的調用,但是當我調用Math.exp(Math.log(10))
(反過來)時,觀察到相同的行爲,只能停在exp,而不是日誌。 ..
任何人都可以重現嗎?這是爲什麼發生?
編輯:它似乎沒有調試Math.log函數。與thisdouble = Math.log(10);
替換行thisdouble = Math.log(Math.exp(10));
,並在調試模式下仍然沒有停止,雖然有在Math.class斷點...
我能夠重現它。很奇怪。這可能是因爲StrictMath使用'native'方法。只需將你的代碼分解一點,然後逐行調試...... – vikingsteve 2013-02-22 08:36:49
因爲答案是「10.0」,所以不會進行優化嗎? – 2013-02-22 08:39:10
不,檢查我的編輯,顯然即使只是調用'Math.log'它自己也不會在調試模式下通過'Math.log' ... – 2013-02-22 08:41:25