Khám phá http://docs.python.org/library/stdtypes.html#float.hex
Hãy thử thực hiện điều này không biết nhiều về sau.
Đầu tiên, chúng ta cần phải trích xuất các phần hex và số mũ từ chuỗi hex:
def extract_parts(hex_val):
if not hex_val.startswith('0x1.'):
return None
relevant_chars = hex_val[4:]
if not len(relevant_chars) > 14 and relevant_chars[13] == 'p':
return None
hex_portion = int(relevant_chars[:13], 16)
if relevant_chars[14] == '+':
p_val = int(relevant_chars[15:])
elif relevant_chars[14] == '-':
p_val = -int(relevant_chars[15:])
else:
return None
return (hex_portion, p_val)
Sau đó, chúng ta cần một cách để tăng theo hướng tích cực hay tiêu cực (chúng tôi sẽ giả chuỗi hex có đã được chuyển đổi sang một số nguyên hex_portion
):
def increment_hex(hex_portion, p_val, direction):
if hex_portion == 0 and direction == -1:
new_hex = 'f' * 13
p_val -= 1
elif hex_portion == int('f' * 13, 16) and direction == 1:
new_hex = '0' * 13
p_val += 1
else:
new_hex = hex(hex_portion + direction)[2:].rstrip('L').zfill(13)
if len(new_hex) != 13:
return None
return format_hex(new_hex, p_val)
Chúng ta cần một hàm helper để định dạng một chuỗi có thể chấp nhận hex và số mũ, mà tôi sử dụng ở trên:
def format_hex(hex_as_str, p_val):
sign = '-' if p_val < 0 else '+'
return '0x1.%sp%s%d' % (hex_as_str, sign, p_val)
Cuối cùng, để thực hiện nextafter
:
def nextafter(float_val):
hex_equivalent = float_val.hex()
hex_portion, p_val = extract_parts(hex_equivalent)
direction = 1
new_hex_equiv = increment_hex(hex_portion, p_val, direction)
return float.fromhex(new_hex_equiv)
Tôi tin rằng không, nhưng chỉ cố gắng xem cách 'std :: nextafter' được triển khai và có thể chúng ta có thể tìm ra thứ gì đó tương đương. – Abhijit
Giải pháp dựa trên cython của tôi sẽ hoạt động trên các cửa sổ (xem bạn là một anh chàng cửa sổ trong tiểu sử của bạn). Bạn có thể cài đặt cython từ pip. Yêu cầu gcc/g ++. Bạn có thể phải đặt các đường dẫn thư viện, library_dirs và include_dirs trong setup.py, chúng là các đường dẫn tệp tiêu chuẩn mà bạn sẽ chuyển tới trình biên dịch của bạn để xây dựng một cái gì đó sử dụng cmath. Không chắc chắn những gì những con đường sẽ trông giống như trên cửa sổ hoặc thậm chí nếu họ sẽ là cần thiết (có lẽ không), nhưng không có lý do nó không nên làm việc. – Endophage
Không, không. Cách dễ nhất để giả mạo nó là sử dụng mô-đun struct để chuyển đổi thành một int 8 byte, thêm một vào int và chuyển đổi ngược lại. Điều đó làm việc tốt cho các số dương và cần một số tinh chỉnh cho các số âm. –