Salida http://docs.python.org/library/stdtypes.html#float.hex
Vamos a probar esto una implementación que no sabe mucho acerca siguiente después.
En primer lugar, tenemos que extraer la parte hexagonal y el exponente de la cadena hexadecimal:
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)
entonces necesitamos una manera de incrementar en sentido positivo o negativo (vamos a asumir la cadena hexadecimal tiene ya ha convertido a un número entero 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)
necesitamos una función auxiliar para cambiar el formato de una cadena aceptable hexagonal y exponente, que utilicé anteriormente:
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)
Por último, para poner en práctica 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)
Creo que no, pero solo tratando de ver cómo se implementa 'std :: nextafter' y es posible que podamos encontrar algo equivalente. – Abhijit
Mi solución basada en cython debería funcionar en Windows (vi que eres un tipo de Windows en tu perfil). Puede instalar cython desde pip. Requiere gcc/g ++. Puede que tenga que establecer las rutas de las bibliotecas, los archivos de biblioteca y los caminos de inclusión en setup.py, que son las rutas de archivos estándar que pasaría a su compilador para crear algo que use cmath. No estoy seguro de cómo se verían esas rutas en Windows o incluso si fueran necesarias (probablemente no), pero no hay razón por la que no debería funcionar. – Endophage
No, no es así. La forma más fácil de falsificarlo es usar el módulo struct para convertir a un int de 8 bytes, agregar uno al int y convertir de nuevo. Eso funciona bien para números positivos, y necesita algunos ajustes para números negativos. –