2009-11-23 5 views
7

Esiste un modo in Haskell per ottenere la costante che è il numero razionale positivo più grande e più piccolo possibile maggiore di zero che può essere rappresentato dai doppi?Haskell minimo/massimo Doppio costante

+0

Davvero, guardando indietro, non ho idea del perché volevo sapere questo ... – Claudiu

risposta

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 ha la funzione [floatRange][2]:

floatRange :: a -> (Int, Int) Fonte

una funzione costante, restituendo i valori più alti e più bassi l'esponente può assumere

che dovrebbe essere quello che vuoi.

+1

Umm? 'Prelude.floatRange' funziona su tutte le istanze di' classe RealFloat', incluso 'Double'. – ephemient

+0

@ephemient: ho capito. Grazie per la spiegazione. –