2014-05-13 15 views
11

पायथन में मुझे फ्लोट्स का एक गुच्छा हेक्साडेसिमल में परिवर्तित करने की आवश्यकता है। इसे शून्य गद्दी होने की आवश्यकता है (उदाहरण के लिए, 0x10 के बजाय 0x00000010)। बस http://gregstoll.dyndns.org/~gregstoll/floattohex/ करता है। (दुख की बात है कि मैं अपने प्लेटफ़ॉर्म पर बाहरी libs का उपयोग नहीं कर सकता, इसलिए मैं उस वेबसाइट पर प्रदान किए गए किसी का उपयोग नहीं कर सकता)एक फ्लोट को हेक्स में परिवर्तित करने के लिए कैसे करें

ऐसा करने का सबसे प्रभावी तरीका क्या है?

+1

क्या यह होमवर्क है? –

+0

[मैं एक अच्छा सवाल कैसे पूछूं?] (Http://stackoverflow.com/help/how-to-ask) – J0HN

+0

'struct' का उपयोग करें और फिर बाइट निकालें। – Anycorn

उत्तर

26

यह पाइथन में थोड़ा मुश्किल है, क्योंकि फ्लोटिंग-पॉइंट वैल्यू को एक (हेक्स) पूर्णांक में परिवर्तित करने की तलाश नहीं कर रहा है। इसके बजाय, आप IEEE 754 को हेक्स के रूप में फ़्लोटिंग-पॉइंट मान के द्विआधारी प्रतिनिधित्व की व्याख्या कर रहे हैं।

हम अंतर्निहित struct लाइब्रेरी से pack और unpack फ़ंक्शंस का उपयोग करेंगे।

float 32-बिट्स है। हम पहले pack इसे बाइनरी स्ट्रिंग में लेंगे, और फिर unpack इसे int के रूप में लेंगे।

def float_to_hex(f): 
    return hex(struct.unpack('<I', struct.pack('<f', f))[0]) 

float_to_hex(17.5) # Output: '0x418c0000' 

हम जानते हुए भी कि यह 64 बिट्स है, double के लिए एक ही कर सकते हैं:

def double_to_hex(f): 
    return hex(struct.unpack('<Q', struct.pack('<d', f))[0]) 

double_to_hex(17.5) # Output: '0x4031800000000000L' 

1 - कच्चे बाइट्स के एक स्ट्रिंग मतलब; एक स्ट्रिंग और शून्य का एक स्ट्रिंग।

+0

बहुत बहुत धन्यवाद। मुझे एहसास नहीं हुआ कि मुझे इसे बाइनरी में बदलने की जरूरत है। – user2339945

11

पायथन float में हमेशा डबल-परिशुद्धता है।

आप अपने जवाब की आवश्यकता होती है हेक्साडेसिमल पूर्णांक के रूप में उत्पादन हो सकता है, सवाल पहले से ही उत्तर दिया गया था:

(17.5).hex() # Output: '0x1.1800000000000p+4' 
(-17.5).hex() # Output: '-0x1.1800000000000p+4' 

# 0x1.18p+4 == (1 + 1./0x10 + 8./0x100) * 2**4 == 1.09375 * 16 == 17.5 

:

import struct 

# define double_to_hex as in the other answer 

double_to_hex(17.5) # Output: '0x4031800000000000' 
double_to_hex(-17.5) # Output: '0xc031800000000000' 

हालांकि आप के बजाय अंतर्निहित फ़ंक्शन का उपयोग करने पर विचार हो सकता यह पहले जैसा ही है, बस एक अधिक संरचित और मानव-पठनीय प्रारूप में।

निचले 52 बिट्स मंटिसा हैं। ऊपरी 12 बिट्स में साइन बिट और 11-बिट एक्सपोनेंट होता है; एक्सपोनेंट पूर्वाग्रह 1023 == 0x3FF है, इसलिए 0x403 का अर्थ है '4'। Wikipedia article on IEEE floating point देखें।

+1

मुझे नहीं पता था कि 'float.hex() 'अस्तित्व में था - धन्यवाद! –

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

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