2009-11-23 46 views
7

Có cách nào trong Haskell để nhận được hằng số đó là số lượng hợp lý lớn nhất và nhỏ nhất có thể lớn hơn 0 mà có thể được biểu diễn bằng cách tăng gấp đôi không?Haskell tối thiểu/tối đa Double Constant

+0

Thật vậy, nhìn lại, tôi không biết tại sao tôi muốn biết điều này ... – Claudiu

Trả lời

7
maxNonInfiniteFloat :: RealFloat a => a -> a 
maxNonInfiniteFloat a = encodeFloat m n where 
    b = floatRadix a 
    e = floatDigits a 
    (_, e') = floatRange a 
    m = b^e - 1 
    n = e' - e 

minPositiveFloat :: RealFloat a => a -> a 
minPositiveFloat a = encodeFloat 1 $ fst (floatRange a) - floatDigits a 
2

GHC.Float có chức năng [floatRange][2]:

floatRange :: a -> (Int, Int) Nguồn

một hàm liên tục, trả lại và giá trị cao nhất thấp nhất số mũ có thể giả định

nên là những gì bạn muốn.

+1

Umm? 'Prelude.floatRange' hoạt động trên tất cả các trường hợp của' lớp RealFloat', bao gồm 'Double'. – ephemient

+0

@ephemient: Tôi hiểu. Cảm ơn lời giải thích. –