2011-12-22 210 views

回答

6

你想要什麼?如果要在浮點數和其實際位表示之間進行轉換,可以使用data-binary-ieee754(使用Foreign.StorableunsafePerformIO)或cereal-ieee754。後者不使用StorableIO,它將值寫入STUArray,轉換數組並讀取其他類型的值。這兩個軟件包都給你一個轉換Float <-> Word32(或Double <-> Word64),轉換WordN[Word8]很容易。

+0

穀物ieee754現在屬於穀物。 – 2011-12-22 13:21:33

+0

很高興知道。不幸的是,轉換函數不再被導出。 – 2011-12-22 14:40:42

+0

當然,您可以通過處理生成的ByteString來自己構建轉換?會有一個性能損失,雖然... – ehird 2011-12-22 14:58:46

1

你不想要存儲你想要的二進制文件。請參閱binary package

Float和Double實例使用前綴「encodeFloat」和「decodeFloat」函數,因爲這些是在浮點值和整數對之間進行轉換的獨立於實現的方式。這兩個整數然後轉換爲字節。

5

我推薦Data.Binary庫。

在這裏看到:

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] 

如果你想知道爲什麼表現是那麼大,這是因爲Binary實例的實施FloatDouble的使用decodeFloat功能:

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

這樣做是爲了保持實現像Haskell報告一樣通用(沒有指定IEEE754或類似的東西)。

要獲得Float的實際二進制表示,您需要使用Storable AFAIK。

相關問題