表示0到1范围内浮点数的最佳方法是什么?

Nik*_*kov 7 floating-point haskell types numbers

我在寻找一个数字类型能够代表,说,值0.2131230.0,或者1.0,但拒绝超范围值,如-0.21231.2312.是否存在符合该目的的特定类型,以及将数字限制在特定范围内的最佳一般方法是什么?

当然,首先想到的答案是:只是使用Double,但是被Haskell的类型系统破坏了我已经习惯了最大程度地保护类型级别的程序.

Tho*_*son 5

一个严肃的建议

您可以在正确的位大小的单词周围使用newtype包装器(和智能构造函数):

newtype SmallFrac = SF Word64

-- Example conversion (You'd actually want to make
-- instances of common classes, I assume)
sfToDouble :: SmallFrac -> Double
sfToDouble (SF x) = fromIntegral x / fromIntegral (maxBound `asTypeOf` x)

instance Show SmallFrac where
    show = show . sfToDouble
Run Code Online (Sandbox Code Playgroud)

实现乘法和除法可能比您想要的更昂贵,但至少添加很容易(模数防止上溢/下溢)并且您声称不需要任何操作,所以甚至更好.

一个不太有用的建议

如果您只需要一个表示值在1和0之间的符号,那么请参考dave4420的建议,并且只需要一个单位类型:

newtype SmallFrac = SF ()
Run Code Online (Sandbox Code Playgroud)

此类型没有任何操作,甚至没有转换到其他类型的兴趣,例如Double,但这符合所述的请求.