2011-12-22 22 views

Respuesta

6

¿Qué es lo que quieres? Si desea convertir entre el Float y su representación de bit real, puede usar data-binary-ieee754 (usa Foreign.Storable y unsafePerformIO debajo del cofre) o cereal-ieee754. Este último no usa Storable o IO, escribe el valor en STUArray, arroja la matriz y lee el valor del otro tipo. Ambos paquetes le dan una conversión de Float <-> Word32 (o Double <-> Word64), la conversión de WordN a [Word8] es fácil.

+0

cereal-ieee754 pertenece ahora al cereal. –

+0

Es bueno saberlo. Lamentablemente, las funciones de conversión ya no se exportan. –

+0

Seguramente puede construir las conversiones usted mismo procesando el ByteString resultante? Sin embargo, habrá una pérdida de rendimiento ... – ehird

1

Usted no quiere Almacenable que desee Binario. Vea el binary package.

Las instancias Float y Double usan las funciones de preludio "encodeFloat" y "decodeFloat", ya que son una forma independiente de implementación de conversión entre un valor de coma flotante y un par de enteros. Los dos enteros se convierten a bytes.

5

Recomiendo la biblioteca Data.Binary.

Ver aquí:

Prelude Data.Binary> encode (13.7 :: Double) 
Chunk "\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\affffff\ESC\255\255\255\255\255\255\255\207" Empty 
Prelude Data.Binary Data.ByteString.Lazy> Data.ByteString.Lazy.unpack $ encode (13.7 :: Double) 
[1,1,0,0,0,0,0,0,0,7,102,102,102,102,102,102,27,255,255,255,255,255,255,255,207] 

Si usted se pregunta por qué la representación es tan grande, que es debido a la aplicación de la Binary instancia para Float y Double utiliza decodeFloat función:

decodeFloat :: RealFloat a => a -> (Integer, Int) 

Esto se hace para mantener la implementación tan genérica como el Informe Haskell (que no especifica IEEE754 ni nada de eso). Para obtener la representación binaria real de un Float, necesita usar Storable AFAIK.

Cuestiones relacionadas