2011-12-22 15 views

cevap

6

İstediğiniz nedir? Float ile gerçek bit gösterimi arasında dönüştürme yapmak isterseniz, data-binary-ieee754 (kaputun altında Foreign.Storable ve unsafePerformIO kullanır) veya cereal-ieee754'u kullanabilirsiniz. İkincisi, Storable veya IO'u kullanmaz, değeri STUArray'a yazar, diziyi yayınlar ve diğer türün değerini okur. Her iki paket de Float <-> Word32 (veya Double <-> Word64) numaralı bir dönüştürmeyi sağlar, WordN değerini [Word8]'a dönüştürmek kolaydır.

+0

cereal-ieee754 şimdi tahıl için aittir. –

+0

Yararlı bilgi. Maalesef, dönüşüm işlevleri artık dışa aktarılmıyor. –

+0

Şüphesiz, sonuçlanan ByteString'i işleyerek dönüşümleri kendiniz oluşturabilirsiniz. Bir performans kaybı olacak olsa da ... – ehird

1

Saklamak istemiyorsunuz İkili istediğiniz. binary package'a bakın.

Float ve Double örnekleri, "encodeFloat" ve "decodeFloat" işlevlerini kullanırlar, çünkü bunlar, bir kayan nokta değeri ve bir çift tamsayı arasında dönüştürme yapmak için uygulamadan bağımsız bir yoldur. İki tam sayı daha sonra baytlara dönüştürülür.

5

Data.Binary kitaplığını öneriyorum.

Buraya bakın:

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

:

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] 

Eğer temsili, bunun nedeni Float ve Double için Binary örneğinin uygulanması büyük olmasıdır neden merak ediyorsanız decodeFloat fonksiyonunu kullanır Bu, uygulamayı Haskell Raporu olarak genel olarak tutmak için yapılır (IEEE754 veya bunun gibi bir şey belirtmez).

Float'un gerçek ikili sunumunu elde etmek için Storable AFAIK kullanmanız gerekir.

İlgili konular