आपके स्वाद के आधार पर आप इसे कुछ अलग तरीके से कर सकते हैं। का उपयोग करते हुए डॉन की तरह एक पुस्तकालय का उल्लेख शायद सर्वोत्तम विकल्प है, अन्यथा आप इन की तर्ज पर कुछ कोशिश कर सकते हैं:
doubleToBytes :: Double -> [Int]
doubleToBytes d
= runST (do
arr <- newArray_ ((0::Int),7)
writeArray arr 0 d
arr <- castDoubleToWord8Array arr
i0 <- readArray arr 0
i1 <- readArray arr 1
i2 <- readArray arr 2
i3 <- readArray arr 3
i4 <- readArray arr 4
i5 <- readArray arr 5
i6 <- readArray arr 6
i7 <- readArray arr 7
return (map fromIntegral [i0,i1,i2,i3,i4,i5,i6,i7])
)
-- | Store to array and read out individual bytes of array
dToStr :: Double -> String
dToStr d
= let bs = doubleToBytes d
hex d' = case showHex d' "" of
[] -> error "dToStr: too few hex digits for float"
[x] -> ['0',x]
[x,y] -> [x,y]
_ -> error "dToStr: too many hex digits for float"
str = map toUpper $ concat . fixEndian . (map hex) $ bs
in "0x" ++ str
-- | Create pointer to Double and cast pointer to Word64, then read out
dToStr2 :: Double -> IO String
dToStr2 f = do
fptr <- newStablePtr f
let pptr = castStablePtrToPtr fptr
let wptr = (castPtrToStablePtr pptr)::(StablePtr Word64)
w <- deRefStablePtr wptr
let s = showHex w ""
return ("0x" ++ (map toUpper s))
-- | Use GHC specific primitive operations
dToStr3 :: Double -> String
dToStr3 (D# f) = "0x" ++ (map toUpper $ showHex w "")
where w = W64# (unsafeCoerce# f)
तीन अलग अलग तरीकों से। अंतिम जीएचसी विशिष्ट है। अन्य दो अन्य हास्केल कंपाइलर्स के साथ काम कर सकते हैं लेकिन अंतर्निहित कार्यान्वयन पर थोड़ा सा भरोसा कर सकते हैं ताकि गारंटी हो सके।
स्रोत
2010-09-21 07:33:41
हास्केल में केवल 4 बाइट्स (32 बिट्स) में तैरते हैं? यह आपको 14 अंकों की मंटिसा और 8-बिट एक्सपोनेंट देने के लिए पर्याप्त प्रतीत नहीं होता है। – pavium