2013-02-22 26 views
0

我剛剛開始分析一個應用程序,它執行一些log linear插值,並且當互相調用Math.logMath.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.logMath.exp這是主要的方法中調用。但是,當我在Math.expMath.log(它們只是調用StrictMathnative 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斷點...

+0

我能夠重現它。很奇怪。這可能是因爲StrictMath使用'native'方法。只需將你的代碼分解一點,然後逐行調試...... – vikingsteve 2013-02-22 08:36:49

+0

因爲答案是「10.0」,所以不會進行優化嗎? – 2013-02-22 08:39:10

+0

不,檢查我的編輯,顯然即使只是調用'Math.log'它自己也不會在調試模式下通過'Math.log' ... – 2013-02-22 08:41:25

回答

0

它不會進入這兩種方法,如果你嘗試這樣說:

Double thisdouble = 0d; 
    double temp = Math.exp(10); 
    thisdouble = Math.log(temp); 
    System.out.println(thisdouble); 

我正在使用Netbeans v7.3

+0

謝謝,你能檢查只是'thisdouble = Math.log(10)'?看看他是否通過Math.log?因爲我使用的是Eclipse,並且你的例子並沒有停止在Math.log中,所以......因此可能是一個與日食有關的問題...... – 2013-02-22 08:45:07