2011-12-22 11 views
7

मैं फ़्लोट को बाइट्स [Word8] (और इसके विपरीत) की सूची में परिवर्तित करना चाहता हूं। मुझे लगता है कि एक स्टेरियल क्लास है जिसका उपयोग शायद इसके लिए किया जा सकता है, लेकिन मैं आईओ मोनैड का उपयोग करने से बचना चाहता हूं क्योंकि इसमें आईओ के साथ कुछ लेना देना नहीं है।मैं फ्लोट और [वर्ड 8] के बीच कैसे परिवर्तित कर सकता हूं?

उत्तर

6

आप क्या चाहते हैं? यदि आप फ्लोट और इसके वास्तविक बिट प्रतिनिधित्व के बीच कनवर्ट करना चाहते हैं, तो आप data-binary-ieee754 का उपयोग कर सकते हैं (Foreign.Storable और unsafePerformIO हुड के नीचे) या cereal-ieee754 का उपयोग कर सकते हैं। उत्तरार्द्ध Storable या IO का उपयोग नहीं करता है, यह STUArray पर मान लिखता है, सरणी को रोकता है और दूसरे प्रकार के मान को पढ़ता है। दोनों पैकेज आपको Float <-> Word32 (या Double <-> Word64) रूपांतरण प्रदान करते हैं, WordN से [Word8] को परिवर्तित करना आसान है।

+0

अनाज-यानी 754 अब अनाज से संबंधित है। –

+0

जानना अच्छा है। दुर्भाग्य से, रूपांतरण कार्यों को अब निर्यात नहीं किया जाता है। –

+0

निश्चित रूप से आप परिणामी बाइटस्ट्रिंग को संसाधित करके रूपांतरण स्वयं बना सकते हैं? एक प्रदर्शन नुकसान होगा, हालांकि ... – ehird

1

आप नहीं चाहते कि आप बाइनरी चाहते हैं। binary package देखें।

फ्लोट और डबल उदाहरण प्रीलोड "एनकोड फ्लोट" और "डीकोड फ्लोट" फ़ंक्शन का उपयोग करते हैं, क्योंकि ये एक फ़्लोटिंग पॉइंट मान और पूर्णांक की एक जोड़ी के बीच परिवर्तित करने का एक कार्यान्वयन-स्वतंत्र तरीका है। फिर दो पूर्णांक बाइट्स में परिवर्तित हो जाते हैं।

5

मैं Data.Binary लाइब्रेरी की अनुशंसा करता हूं।

यहाँ देखें:

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] 

आप सोच रहे हैं कि क्यों यह दर्शाया है कि बड़ा है, यह Float और Double के लिए Binary उदाहरण के कार्यान्वयन की वजह से है decodeFloat फ़ंक्शन का उपयोग करता कार्यान्वयन को हास्केल रिपोर्ट के रूप में जेनेरिक के रूप में रखने के लिए किया जाता है (जो आईईईई 754 या उस तरह कुछ भी निर्दिष्ट नहीं करता है)।

Float के वास्तविक बाइनरी प्रतिनिधित्व प्राप्त करने के लिए, आपको Storable AFAIK का उपयोग करने की आवश्यकता है।

संबंधित मुद्दे

 संबंधित मुद्दे