浮動小数点数を定義された桁数に丸める関数を作成しようとしています。私がこれまでに思いついたのはこれです:
import Numeric;
digs :: Integral x => x -> [x] <br>
digs 0 = [] <br>
digs x = digs (x `div` 10) ++ [x `mod` 10]
roundTo x t = let d = length $ digs $ round x <br>
roundToMachine x t = (fromInteger $ round $ x * 10^^t) * 10^^(-t)
in roundToMachine x (t - d)
関数を使用しdigs
てコンマの前の桁数を決定し、入力値を最適化しています (つまり、コンマを超えてすべてを移動すると、 に1.234
なります0.1234 * 10^1
)
関数はほとんどのroundTo
入力で機能するようですが、一部の入力では奇妙な結果が得roundTo 1.0014 4
られ1.0010000000000001
ます1.001
。
この例の問題は、計算によって引き起こされます1001 * 1.0e-3
(これは を返します1.0010000000000001
) 。
これは、私が一緒に暮らさなければならないHaskellの数値表現の問題ですか、それとも浮動小数点数を特定の桁数に丸めるより良い方法はありますか?