hextonumber は 64 ビットでは動作しませんこんにちは
16 進数はbea000000004080bh です。hextonumber("bea000000004080bh") を試しましたが、機能しません。誰か助けてくれませんか?
自動化とスクリプトRe: hextonumber が 64 ビットで動作しないこんにちは、
本当に 64 ビットの 16 進数ですか? 「h」の数字を含めると、標準形式に準拠していないようです。
最高、
TS
Re: hextonumber が 64 ビットで動作しない申し訳ありませんが、末尾の h を削除するのを忘れました。出力 raw には常に末尾に h が付いており、これは hextonumber を実行する前に除外する必要がある 16 進数値を示します。
問題は、予想した数値と一致しないことです。
JMPはこれを-4.768372e-7に変換した。
予想値は-4710765210229274613です

何が足りないのでしょうか?
Re: hextonumber が 64 ビットで動作しない表示される値は符号付き整数であり、HexToNumber() は符号なし整数を返します。
また、ベースを指定する必要があります。
a = HexToNumber("bea000000004080b",Base(16));
符号付き整数の問題を回避するには、次のような数式を使用できます。
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
しかし、JMP では 64 ビットの整数値を正確にレンダリングできないという別の問題が発生します。最後の 2 桁は切り捨てられ、ランダムな値になります。64 ビットの値を上位 32 ビット値と下位 32 ビット値に分割し、それらの値を 2 つの別々の列に保存することをお勧めします。次のようになります。
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
添付のデータテーブルの例を参照してください。
Re: hextonumber が 64 ビットで動作しないhextonumber() には改善が必要なようですが、なぜ計算機と同じようにできないのでしょうか (最初の投稿の画像を参照)?
数百万のデータ ポイントを処理する場合、上位 32 と下位 32 に分解するのは効率的ではありません。それぞれ 4000 万行を超える 16 進値を含む数百のファイルを処理する必要があります。32 に分解すると時間がかかりすぎます。
他に何か提案はありますか?
Re: hextonumber が 64 ビットで動作しないこれには Python を使用します。嬉しいことに、JMP18 では Python スクリプトを JMP 内で直接実行できます。必要な処理を実行する Python スクリプトは次のようになります。
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
JMP の精度が 17 桁に制限されている理由は、JMP が数値に float64 を使用しているためです。17 桁を超える数値を取得するには、数値に float128 を使用して JMP を再コンパイルする必要があり、システム メモリの使用量が増えます。これが重要な場合は、機能リクエストとして送信できます。こちらから送信できます: https://community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
Re: hextonumber が 64 ビットで動作しない@dadawasozo時間がかかりすぎるというのはどういうことでしょうか (40 000 000 * 100 行を超えるデータがあります)? そのデータを高速に変換する必要がある場合は、少し工夫する必要があるかもしれません (これとは直接関係ありませんが、「The One Billion Row Challenge」、 https://github.com/gunnarmorling/1brc について読むと興味深いです。Googleで他の言語のソリューションを見つけることもできますし、YouTube にもいくつかのソリューションを示して説明しているビデオがあります)。
@mzwald JMP に戻ったとき、文字列に変換する以外に「OverflowError: Python int が大きすぎて C long に変換できません」を回避する方法はありますか? 値を分割しますか?
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 が 64 ビットで動作しない@jthi値を分割するか文字列として保存することが、すべての桁を保持する唯一の方法です。C++ の float64 変数の制限により、JMP の数値は 17 桁に制限されます。どうやら Python は、数値が 64 ビットまたは 128 ビットに制限されず、サポートする RAM がある限り、値を格納するために必要なビット数だけ使用できるという意味で、無制限の精度を持っているようです。
Re: hextonumber が 64 ビットで動作しないはい、そのために Python を統合しています。
ご意見をくださった皆様、ありがとうございました。