Partenza http://docs.python.org/library/stdtypes.html#float.hex
Proviamo questo un'implementazione che non sa molto di successivo dopo.
In primo luogo, abbiamo bisogno di estrarre la parte esagonale e l'esponente dalla stringa esadecimale:
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)
Poi abbiamo bisogno di un modo per incrementare in direzione positiva o negativa (si suppone che la stringa esadecimale ha già stato convertito in un numero intero 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)
Abbiamo bisogno di una funzione di supporto per riformattare una stringa esadecimale accettabile e esponente, che ho usato sopra:
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)
Infine, per implementare 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)
Credo di no, ma sto solo provando a vedere come 'std :: nextafter' è implementato e può darsi che possiamo inventare qualcosa di equivalente. – Abhijit
La mia soluzione basata su cython dovrebbe funzionare su Windows (ho visto che sei un ragazzo di Windows nel tuo profilo). È possibile installare cython da pip. Richiede gcc/g ++. Potrebbe essere necessario impostare le librerie, le dir_serie e i percorsi include_dirs nel setup.py, sono i percorsi di file standard che si dovrebbero passare al compilatore per creare qualcosa che usi il cmath. Non sei sicuro di quali sarebbero quei percorsi su Windows o anche se sarebbero necessari (probabilmente no), ma non c'è motivo per cui non dovrebbe funzionare. – Endophage
No, non è così. Il modo più semplice per fingere è usare il modulo struct per convertire in un int 8 byte, aggiungerne uno all'int e riconvertire. Questo funziona bene per numeri positivi, e ha bisogno di qualche ritocco per i numeri negativi. –