Я пытаюсь создать небольшой модуль для выполнения вычислений на основе десятичных чисел. Ряд хранится в виде целого числа mantisse, с точностью значения, указанного в Int:Как оптимизировать этот фрагмент haskell
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
@KennyTM это то, что я предположил, поскольку Integer не может иметь ведущих нулей –
Извините ... Исправлено. – fuz