2011-12-22 41 views

Trả lời

6

Bạn muốn gì? Nếu bạn muốn chuyển đổi giữa Float và biểu diễn bit thực tế của nó, bạn có thể sử dụng data-binary-ieee754 (sử dụng Foreign.StorableunsafePerformIO dưới mui xe) hoặc cereal-ieee754. Sau này không sử dụng Storable hoặc IO, nó ghi giá trị vào một số STUArray, tạo mảng và đọc giá trị của loại khác. Cả hai gói đều cung cấp cho bạn chuyển đổi Float <-> Word32 (hoặc Double <-> Word64), chuyển đổi WordN thành [Word8] thật dễ dàng.

+0

cereal-ieee754 thuộc về ngũ cốc. –

+0

Điều cần biết. Thật không may, các chức năng chuyển đổi không còn được xuất nữa. –

+0

Chắc chắn bạn có thể tự mình xây dựng các chuyển đổi bằng cách xử lý ByteString kết quả? Sẽ có một sự mất mát hiệu suất, mặc dù ... – ehird

1

Bạn không muốn Đáng yêu bạn muốn Nhị phân. Xem binary package.

Các trường hợp Nổi và Đôi sử dụng các hàm "encodeFloat" và "decodeFloat" mở đầu, vì đây là một cách độc lập thực hiện chuyển đổi giữa giá trị dấu phẩy động và cặp số nguyên. Hai số nguyên sau đó được chuyển đổi thành byte.

5

Tôi khuyên bạn nên sử dụng thư viện Data.Binary.

Xem ở đây:

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] 

Nếu bạn đang tự hỏi tại sao các đại diện là lớn, đó là vì việc thực hiện các Binary dụ cho FloatDouble sử dụng decodeFloat chức năng:

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

Điều này được thực hiện để giữ cho việc thực hiện như chung chung như Báo cáo Haskell (mà không chỉ định IEEE754 hoặc bất cứ điều gì như thế).

Để nhận được biểu diễn nhị phân thực tế của Float, bạn cần sử dụng Storable AFAIK.

Các vấn đề liên quan