hextonumber non funziona con 64 bitCIAO
Ho hex che è bea000000004080bh, ho provato hextonumber("bea000000004080bh"), ma non funziona. Qualcuno può aiutarmi?
Automazione e scriptingRe: hextonumber non funziona con 64 bitCIAO,
Sei sicuro che sia un esadecimale a 64 bit? Includere la cifra "h" non sembra conforme al formato standard.
Migliore,
STUDENTI
Re: hextonumber non funziona con 64 bitMi dispiace, ho dimenticato di rimuovere la h alla fine. L'output raw ha sempre la h alla fine per indicare il valore esadecimale che dobbiamo escludere prima di usare hextonumber.
Ora il problema è che non corrisponde al numero che ci aspettavamo.
JMP lo ha convertito come -4.768372e-7
previsto è -4710765210229274613

Cosa mi sfugge?
Re: hextonumber non funziona con 64 bitIl valore mostrato è un intero con segno e HexToNumber() restituisce un intero senza segno.
Inoltre devi specificare la base, qualcosa come
a = HexToNumber("bea000000004080b",Base(16));
Per aggirare il problema degli interi con segno, puoi usare una formula come questa:
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
Ma poi ti imbatti in un altro problema, ovvero che JMP non riesce a rendere un valore intero a 64 bit in modo preciso. Le ultime due cifre verranno troncate e avranno valori casuali. Ti consiglierei di suddividere il tuo valore a 64 bit in un valore superiore a 32 bit e in un valore inferiore a 32 bit e di memorizzare tali valori in due colonne separate. Qualcosa del genere:
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
Fare riferimento all'esempio di tabella dati allegato.
Re: hextonumber non funziona con 64 bitSembra che sia necessario migliorare l'hextonumber(), perché non può fare lo stesso della calcolatrice (vedi immagine nel primissimo post)?
la suddivisione in 32 superiore e inferiore non è efficiente quando si ha a che fare con milioni di punti dati. Devo elaborare centinaia di file, ognuno dei quali contiene più di 40M righe di valore esadecimale. la suddivisione in 32 richiederebbe troppo tempo.
qualche altro suggerimento?
Re: hextonumber non funziona con 64 bitIo userei python per questo. La buona notizia è che JMP18 può eseguire script python direttamente in JMP. Questo sarebbe lo script python per fare ciò che vuoi:
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
Per quanto riguarda il motivo per cui JMP è limitato a 17 cifre di precisione, è perché JMP utilizza float64 per i valori numerici. Per ottenere più di 17 cifre, JMP dovrebbe essere ricompilato utilizzando float128 per i valori numerici, il che gli farebbe utilizzare più memoria di sistema. Se questo è importante, puoi inviarlo come richiesta di funzionalità. Puoi farlo qui: https://community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
Re: hextonumber non funziona con 64 bit@dadawasozo cos'è troppo tempo (hai più di 40.000.000 * 100 righe di dati)? Se devi convertire quei dati velocemente, potresti dover essere un po' creativo (non direttamente correlato a questo ma è interessante leggere di "The One Billion Row Challenge", https://github.com/gunnarmorling/1brc, puoi anche trovare soluzioni per altre lingue su Google e ci sono anche video su YouTube che mostrano e spiegano alcune soluzioni).
@mzwald Quando torni a JMP, c'è un modo per evitare "OverflowError: Python int troppo grande per essere convertito in C long" se non convertendolo in stringa? Dividendo il valore?
Names Default To Here(1);
hex_to_signed_int_str = function({h},
Python Execute({h}, {x},
"\[import binascii
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
x = int.from_bytes(ba, byteorder='big', signed=True)
#x = str(x)
]\");
return(x);
);
signed_int_str = hex_to_signed_int_str("bea000000004080b");
show(signed_int_str);
Re: hextonumber non funziona con 64 bit@jthi dividere il valore o memorizzarlo come stringa sarebbe l'unico modo per preservare tutte le cifre. Qualsiasi valore numerico in JMP sarà limitato a 17 cifre a causa delle limitazioni delle variabili float64 in C++. Apparentemente Python ha una precisione illimitata nel senso che i valori numerici non sono limitati a 64 bit o 128 bit, ma possono usare tutti i bit necessari per memorizzare il valore, purché si disponga della RAM per supportarlo.
Re: hextonumber non funziona con 64 bitSì, per questo integriamo Python.
Grazie a tutti per il contributo.