我想創建一個小模塊來做基於小數的計算。一些被存儲爲一個整數mantisse,與由一個int指定精度值:如何優化這個哈斯克爾片段
data APNum =
{ getMantisse :: Integer
, getPrecision :: Int }
例如:
APNum 123 0 -> 123
APNum 123 1 -> 1.23
APNum 123 2 -> 12.3
...
(負精度是不允許的)。
現在,我寫了這個功能,它通過剝離儘可能多的尾隨零的儘可能自動調節精度:
autoPrecision :: APNum -> APNum
autoPrecision [email protected](APNum m p) = if p > maxPrecision
then autoPrecision $ setPrecision x maxPrecision
else autoPrecision' m p where
autoPrecision' m p = let (m',r) = m `divMod` 10 in
if r /= 0 || p <= 0 then APNum m p else autoPrecision' m' (pred p)
(MaxPrecision和setPrecision是顯而易見的,我認爲)。
問題是,這個片段有一個非常糟糕的表現,特別是n個數字超過10000個數字。有沒有簡單的優化?
「前導零」是否指「尾隨零」? (即'APNum 12000 5' - >'APNum 12 2') – kennytm 2010-08-18 07:26:54
@KennyTM這就是我所假設的,因爲整數不能有前導零 – 2010-08-18 09:18:03
對不起......固定。 – fuz 2010-08-18 10:45:59