2014-05-13 17 views
11

Trong Python tôi cần phải chuyển đổi một loạt các phao nổi vào thập lục phân. Nó cần phải được đệm không (ví dụ, 0x00000010 thay vì 0x10). Giống như http://gregstoll.dyndns.org/~gregstoll/floattohex/. (Thật đáng buồn tôi không thể sử dụng libs bên ngoài trên nền tảng của tôi vì vậy tôi không thể sử dụng một trong những cung cấp trên trang web đó)Làm thế nào để chuyển đổi một phao vào hex

cách hiệu quả nhất để làm điều này là gì?

+1

Đây có phải là bài tập về nhà không? –

+0

[Làm cách nào để đặt câu hỏi hay?] (Http://stackoverflow.com/help/how-to-ask) – J0HN

+0

sử dụng 'struct' và sau đó trích xuất byte. – Anycorn

Trả lời

26

Đây là một chút khó khăn trong python, bởi vì không tìm cách chuyển đổi dấu phẩy động giá trị thành số nguyên (hex). Thay vào đó, bạn đang cố gắng để diễn giải các IEEE 754 biểu thị nhị phân của giá trị dấu phẩy động dưới dạng hex.

Chúng tôi sẽ sử dụng các chức năng packunpack từ được xây dựng trong struct thư viện.

Một float là 32-bit. Chúng tôi sẽ lần đầu tiên pack nó thành một nhị phân chuỗi, và sau đó unpack nó như một int.

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

float_to_hex(17.5) # Output: '0x418c0000' 

Chúng ta có thể làm tương tự cho double, biết rằng nó là 64 bit:

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

double_to_hex(17.5) # Output: '0x4031800000000000L' 

1 - Có nghĩa là một chuỗi các byte thô; không phải một chuỗi số và số 0.

+0

Cảm ơn rất nhiều. Đã không nhận ra rằng tôi cần phải chuyển nó sang nhị phân trước. – user2339945

11

Trong Python float luôn chính xác gấp đôi.

Nếu bạn cần câu trả lời của bạn sẽ được đầu ra trong các hình thức của một số nguyên hệ thập lục phân, câu hỏi đã được trả lời:

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' 

Tuy nhiên bạn thay vì có thể cân nhắc sử dụng các chức năng được xây dựng trong:

(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 

Đây là câu trả lời giống như trước đây, chỉ ở định dạng có cấu trúc và dễ đọc hơn.

52 bit thấp hơn là mantissa. 12 bit trên bao gồm bit dấu và số mũ 11 bit; độ lệch số mũ là 1023 == 0x3FF, vì vậy 0x403 có nghĩa là '4'. Xem Wikipedia article on IEEE floating point.

+1

Tôi không nhận ra 'float.hex()' tồn tại - cảm ơn! –

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