2012-03-20 77 views
1

我有一個項目,我們試圖獲得代碼空間。我們在一個文件中有一個點,它從數學庫中調用pow()函數,它爲這一行代碼添加了一個額外的+ 12k代碼到最終的十六進制。我已經做了一些搜索,我似乎無法找到一種在數學庫之外做pow函數的好方法。我找到的每個例子都是使用數學庫。最糟糕的是我需要浮點數,因爲我需要提出一些不斷變化爲1.4的冪的未知變量,而我所掌握的控制器實際上並沒有浮點數。一些沒有浮點的72Mhz 32位ARM器件被告知,因此這是一個庫函數的巨大空間。有沒有人試圖做到這一點,贏得了戰鬥?製作你自己的pow()

回答

1

您可以使用this rule on fractional exponents將其分解爲一個整數根和整數冪函數,一個接一個地應用。

由於指數是固定的,因此可以使您的代碼更簡單,因爲1.4 = 7/5。現在您只需編寫一個函數,在整數輸入上一次執行這兩個精確的兩個步驟,您可以避免浮點計算的損失。

+0

Duh ..明顯的總是讓我......對於讀這個並且到達這裏的任何人來到維基百科並且搜索「第n個根算法」,並且這個等式的後半部分在那裏解釋得非常好。這也可以用來刪除任何不必要的sqrt()調用。這消除了很多不必要的代碼,但我不知道完成後會有多少。我不會去編寫這個了幾天。 – user1054210 2012-03-21 14:59:51

0

你可能逃脫使用float代替doublepowf()更少的代碼:

float var=0.12345f; 
var=powf(var,1.4f); 

當然,其結果將是不太準確。

1

由於 的指數是固定的,因此您的問題比編寫廣義pow()函數稍微簡單一些。您也可以從全功能的pow()中稍微放寬精度要求 。

選項1:爲f(x)= x^1.4實施Taylor Series展開式。你會 需要選擇一些x的值來擴大泰勒級數,並且當x離這個值越遠,你將會失去精度。選項2:通過在某些 點數處列出x^1.4的值構造插值表,然後使用線性(或更高階多項式)插值計算中間點處的值。