2009-11-23 9 views
7

¿Hay alguna forma en Haskell de obtener la constante que sea el número racional positivo mayor y menor posible mayor que cero que pueda representarse mediante dobles?Haskell mínimo/máximo Doble constante

+0

En verdad, mirando hacia atrás, no tengo idea de por qué quería saber esto ... – Claudiu

Respuesta

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 tiene la función [floatRange][2]:

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

una función constante, la devolución de los valores más altos y más bajos que el exponente puede asumir

que debería ser lo que quieres.

+1

Umm? 'Prelude.floatRange' funciona en todas las instancias de' clase RealFloat', incluido 'Double'. – ephemient

+0

@ephemient: Entiendo. Gracias por la explicación. –