Hextonumber funktioniert nicht mit 64 BitHallo
Ich habe Hex, das ist bea000000004080bh, ich habe hextonumber("bea000000004080bh") ausprobiert, aber es funktioniert nicht. Kann mir jemand helfen?
Automatisierung und SkriptingBetreff: Hextonumber funktioniert nicht mit 64 BitHallo,
Sind Sie sicher, dass es sich um eine 64-Bit-Hexadezimalzahl handelt? Die Einbeziehung der Ziffer „h“ scheint nicht dem Standardformat zu entsprechen.
Am besten,
TS
Betreff: Hextonumber funktioniert nicht mit 64 BitEntschuldigung, ich habe vergessen, das h am Ende zu entfernen. Die Rohausgabe hat am Ende immer ein h, um einen Hex-Wert anzuzeigen, den wir ausschließen müssen, bevor wir Hextonumber erstellen.
Jetzt besteht das Problem darin, dass es nicht mit der erwarteten Zahl übereinstimmt.
JMP hat es in -4,768372e-7 konvertiert.
erwartet wird -4710765210229274613

Was fehlt mir?
Betreff: Hextonumber funktioniert nicht mit 64 BitDer angezeigte Wert ist eine vorzeichenbehaftete Ganzzahl und HexToNumber() gibt eine vorzeichenlose Ganzzahl zurück.
Außerdem müssen Sie die Basis angeben, etwa wie
a = HexToNumber("bea000000004080b",Base(16));
Um das Problem mit den vorzeichenbehafteten Ganzzahlen zu umgehen, können Sie eine Formel wie diese verwenden:
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
Dann stößt man jedoch auf ein weiteres Problem: JMP kann einen 64-Bit-Integer-Wert nicht präzise rendern. Die letzten beiden Ziffern werden abgeschnitten und haben zufällige Werte. Ich würde empfehlen, den 64-Bit-Wert in einen oberen 32-Bit-Wert und einen unteren 32-Bit-Wert aufzuteilen und diese Werte in zwei separaten Spalten zu speichern. Etwa so:
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
Siehe das beigefügte Datentabellenbeispiel.
Betreff: Hextonumber funktioniert nicht mit 64 Bithört sich an, als ob Hextonumber() verbessert werden müsste. Warum kann es nicht dasselbe tun wie der Taschenrechner (siehe Bild im allerersten Beitrag)?
Das Aufteilen in obere und untere 32 ist bei Millionen von Datenpunkten nicht effizient. Ich muss Hunderte von Dateien verarbeiten, die jeweils mehr als 40 Millionen Zeilen mit Hexadezimalwerten enthalten. Das Aufteilen in 32 würde zu viel Zeit in Anspruch nehmen.
irgendwelche anderen Vorschläge?
Betreff: Hextonumber funktioniert nicht mit 64 BitIch würde dafür Python verwenden. Die gute Nachricht ist, dass JMP18 Python-Skripte direkt in JMP ausführen kann. Dies wäre das Python-Skript, das das tut, was Sie wollen:
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
Der Grund, warum JMP auf eine Genauigkeit von 17 Ziffern beschränkt ist, liegt darin, dass JMP für numerische Werte Float64 verwendet. Um mehr als 17 Ziffern zu erhalten, müsste JMP mit Float128 für numerische Werte neu kompiliert werden, was mehr Systemspeicher verbrauchen würde. Wenn dies wichtig ist, können Sie es als Funktionsanforderung einreichen. Sie können dies hier tun: https://community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
Betreff: Hextonumber funktioniert nicht mit 64 Bit@dadawasozo, was ist zu viel Zeit (Sie haben über 40 000 000 * 100 Datenzeilen)? Wenn Sie diese Daten schnell konvertieren müssen, müssen Sie möglicherweise etwas kreativ werden (nicht direkt damit verbunden, aber interessant, über „The One Billion Row Challenge“ zu lesen, https://github.com/gunnarmorling/1brc, Sie können bei Google auch Lösungen für andere Sprachen finden und es gibt auch Videos auf YouTube, die einige Lösungen zeigen und erklären).
@mzwald Wenn Sie zu JMP zurückkehren, gibt es eine Möglichkeit, „OverflowError: Python int too large to convert to C long“ zu vermeiden, außer durch Konvertieren in einen String? Durch Aufteilen des Wertes?
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);
Betreff: Hextonumber funktioniert nicht mit 64 Bit@jthi Das Aufteilen des Werts oder das Speichern als Zeichenfolge wäre die einzige Möglichkeit, alle Ziffern beizubehalten. Jeder numerische Wert in JMP ist aufgrund der Beschränkungen der Float64-Variablen in C++ auf 17 Ziffern begrenzt. Anscheinend hat Python eine unbegrenzte Genauigkeit in dem Sinne, dass numerische Werte nicht auf 64 Bit oder 128 Bit begrenzt sind, sondern so viele Bits wie nötig zum Speichern des Werts verwenden können, solange Sie über den entsprechenden RAM verfügen.
Betreff: Hextonumber funktioniert nicht mit 64 Bitja, wir integrieren dafür Python.
Vielen Dank an alle für die Beiträge.