2014-01-17 3 views
1

с помощью функции итерационной, как принять 4 (итерация (+0,001) 1,0), ответ я получил это [1.0,1.001,1.0019999999999998,1.0029999999999997]итерации и округляет в Haskell

но хотите приращение 0.001 и ответа как [1,0,1.001,1.002,1.003] как округлить значение?

Заранее спасибо

+0

Вы против использования рационального типа номера? – DiegoNolan

+0

Просто не существует числа, которое может быть представлено как число с плавающей запятой, которое дает вам то, что вы хотите. 0.001 не могут быть представлены точно, и следующий номер, который вы можете выбрать, который дает другой ответ, превысит желаемый результат. Плавающая точка тяжелая. – augustss

ответ

3

Вы можете использовать Data.Fixed:

import Data.Fixed 

xs1 = take 4 $ iterate (+0.001) (1.0::Fixed E3) 

-- or you can use Enum instance for (Fixed a) also 
xs2 = take 4 [1.0::Fixed E3, 1.001..] 
0

Это можно сделать с помощью Rational, а также Исправлено:

x = take 4 $ map (fromRational) [1.000::Rational, 1.001..] 

Это также может быть полезным, так как Rational мая легче работать, например:

map (logBase 10 . fromRational) $ take 4 [1.000::Rational, 1.001..] 
Смежные вопросы