2011-11-08 28 views
1

有沒有iPhone的定點庫?我有一些執行不少浮點操作的代碼,但在電話上運行得非常慢,我想看看整型計算的性能如何比較。適用於iPhone的固定點庫?

我發現了NSDecimalNumber和NSDecimal,但是這兩者似乎都有相當笨拙的API,並且NSDecimalNumber類爲每次計算都分配一個新對象,這可能會消除使用定點的任何性能增益。

+0

不是一個愚蠢的,但你可以在iPhone上使用c + +庫:http://stackoverflow.com/questions/2945747/c-fixed-point-library – mkb

+0

什麼樣的操作?對於許多功能和操作,短浮點操作的序列與新iOS設備上的定點數學一樣快或更快。 – hotpaw2

+0

立方根,乘法和除法。到目前爲止,我的經驗是,每次轉換爲整數運算都是值得的,但是當我嘗試定點時我肯定會進行配置。 – Bill

回答

1

我覺得C++模板應該更有效一個庫。我沒有使用這個Fixed Point Class,但從描述聽起來很有前途,值得一看。

+0

謝謝。看起來像那個需要'提升',這可能會使我的應用程序下降一點。 – Bill

+0

我認爲庫和模板的效率取決於代碼的複雜性和編譯器的優化能力。對於像定點數學這樣複雜的事情,我認爲你無法可靠地預測哪個更快。不過,不錯的鏈接@progrmr。我一直在尋找這樣一個圖書館很長一段時間。 –

1

程序中提到的library看起來很豐富 - 既有充滿特色的感覺,也有豐富的沉重感。由於您的需求相對簡單且有限,因此自定義可能會導致最高效的代碼,但編寫起來肯定會有點困難。

對於乘法,考慮每個因子有多少個整數和小數位,然後乘以下一個更寬的整數,然後記住二進制點已移到的位置。例如:

i32_t s3dot28 = (int)(3.14159 * (1 << 28)); // 1 sign, 3 integer, 28 fractional bits 
i32_t s15dot16 = (int)(1234.5678 * (1 << 16)); // 1 sign, 15 integer, 16 fractional bits 

i64_t temp = (i64_t)s3dot28 * (i64_t)s15dot16; 

// After the multiply, the binary point is at position 28 + 16 = 44. 
// We want an integer result, so we need to shift right by 32 bits. 
// However, in a signed multiply, the sign bit is duplicated, so 
// shifting right by 31 bits is safe, and preserves a bit of precision. 

i32_t s18dot13 = (i32_t)(temp >> 31); // 1 sign, 18 integer, 13 fractional bits 

雖然這比使用圖書館或模板類有點困難,它有時比使用整個代碼統一整數和小數位計數庫/模板保存更精確的優勢。最好將它看作整數浮點,因爲二進制點在一個整數內浮動,而不是停留在固定位置。爲了更加精確,您可以在乘法之前將MSB末尾的複製符號位數保留下來。

have read在iOS設備中使用的ARM處理器沒有劃分指令,因此劃分是昂貴的。首先計算除數(又名分母)的倒數(又名倒數),然後相乘,可能擊敗Apple/ARM提供的實現。 Newton-Raphson是用於計算數字的逆的常用技術,可以用幾行代碼完成。

對於立方體根,Newton-Raphson也可以應用,但你可能會有更好的表現,this code黑客的喜悅。它專爲64位整數設計,但可能適用於較窄類型。