2010-09-09 88 views
0

我正在爲java中的C,exp,log和sqrt做一些近似函數。我對指針如何工作有些生疏 - 這個語法是否正確?C近似函數

#include <math.h> 
#include "QDMath.h" 

JNIEXPORT jdouble JNICALL Java_QDMath_exp 
    (JNIEnv *env, jclass class, jdouble val) 
{ 
    jint tmp = (jint) (1512775 * val + 1072632447); 
    jdouble p = 0.0; 
    *(1 + (jint *) &p) = tmp; 
    return p; 
} 

JNIEXPORT jdouble JNICALL Java_QDMath_log 
    (JNIEnv *env, jclass class, jdouble val) 
{ 
    jint tmp = (*(1 + (jint *) &val)); 
    jdouble p = ((jdouble) tmp - 1072632447)/1512775; 
    return p; 
} 

JNIEXPORT jdouble JNICALL Java_QDMath_sqrt 
    (JNIEnv *env, jclass class, jdouble val) 
{ 
    jlong tmp = ((*(jlong *) &val) - 1065353216)>>1; 
    return *(jdouble *) &tmp; 
} 
+0

謝謝,你打敗我重新格式化 – ShahQermez 2010-09-09 20:29:19

回答

5

一眼看去,語法看起來正確(儘管編譯器會告訴你比我們更快)。

但是,你在做什麼看起來相當嚴峻。重新解釋double s爲int s是平臺相關的(考慮endianness和sizeof問題),並且也會落入「嚴格別名」規則的犯規。

+0

此外,其中一些計算可能會產生浮點值太大,以保持int,從而調用未定義的行爲。這些功能是非常具體的實現,假設它們都可以工作。 – 2010-09-09 21:20:47

+0

http://cnl.salk.edu/~schraudo/pubs/Schraudolph99.pdf是exp和日誌函數的來源 http://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Approximations_that_depend_on_IEEE_representation explain sqrt – ShahQermez 2010-09-09 22:28:36

+3

我會親自用一些積極的編譯時間斷言來保護所有這樣的代碼,以驗證目標浮點數是否具有他們所依賴的表示。大恐怖的警衛會提醒未來的代碼審查人員,這是神奇的,而且你確實考慮過魔法的效果。請記住,從現在開始五年後,評論者可能就是你。另外,一些評論中的內容指出瞭解釋如何以及爲什麼會起作用的參考。你未來的自我將不太可能想要時間旅行,以這種方式擊敗你的頭腦;-) – RBerteig 2010-09-10 03:02:41

2

一般來說,這看起來很不對,併爲我提出了一些紅旗,但你可能沒問題。

使用Java類型是有幫助的。如果您投射到int,則在某些機器上會出現問題,因爲ints可能是32位或64位。使用jint,它應該始終是32位,所以在這方面你是安全的。

我還不完全清楚你正在嘗試什麼。例如,該行:

*(1 + (jint *) &p) = tmp; 

你所說的做的是把P的地址(雙),把它當作一個Java的整數地址,然後添加一個到它。這將意味着採取加倍的位置,並看看4個字節......將您置於IEEE encoded double的小數部分。

然後,您將該位置設置爲tmp中的值...這是一個整數,而不是IEEE編碼的值。

除非您通過直接操作double的位來做某件事incredibly clever,否則您正在做的事情會產生無意義的結果。

+0

這種事情看起來很像老式的「逆平方根」技巧:http://en.wikipedia.org /維基/ Fast_inverse_square_root。嚴峻。 – 2010-09-09 21:11:11

+0

我的猜測是'jint'會是一個Java'int',它是四個字節。但是,我不知道任何指數和尾數都佔用四個字節的格式(將符號位放在您將要到達的位置)。 – 2010-09-09 21:22:36

+0

jints上的良好調用...我忘記了JDK將確保這些調整大小以匹配固定的Java規範。我已經相應更新。 – 2010-09-09 22:15:30