hextonumber가 64비트에서 작동하지 않습니다안녕
저는 bea000000004080bh라는 16진수를 가지고 있습니다. hextonumber("bea000000004080bh")를 시도했지만 작동하지 않습니다. 누군가 도와줄 수 있나요?
자동화 및 스크립팅Re: hextonumber가 64비트에서 작동하지 않음안녕,
64비트 16진수인지 확실합니까? "h" 숫자를 포함하는 것은 표준 형식에 맞지 않는 것 같습니다.
최상의,
티에스
Re: hextonumber가 64비트에서 작동하지 않음죄송합니다. 끝의 h를 제거하는 것을 깜빡했습니다. 출력 raw에는 항상 16진수 값을 나타내기 위해 h가 끝에 포함되는데, hextonnumber를 사용하기 전에 이 값을 제외해야 합니다.
문제는 그 숫자가 우리가 기대했던 것과 일치하지 않는다는 것입니다.
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비트 정수 값을 정확하게 렌더링할 수 없다는 또 다른 문제가 발생합니다. 마지막 두 자리는 잘리고 무작위 값이 됩니다. 64비트 값을 상위 32비트 값과 하위 32비트 값으로 나누고 두 개의 별도 열에 해당 값을 저장하는 것이 좋습니다. 다음과 같습니다.
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
첨부된 데이터 표 예를 참조하세요.
Re: hextonumber가 64비트에서 작동하지 않음hextonumber()에 개선이 필요한 듯합니다. 왜 계산기처럼 같은 작업을 수행할 수 없을까요? (첫 번째 게시물의 그림 참조)
수백만 개의 데이터 포인트를 처리할 때 상위 32와 하위 32를 분해하는 것은 효율적이지 않습니다. 각각 40M 행 이상의 16진수 값이 포함된 수백 개의 파일을 처리해야 합니다. 32를 분해하는 데 너무 많은 시간이 소모됩니다.
다른 제안이 있으신가요?
Re: hextonumber가 64비트에서 작동하지 않음저는 이를 위해 파이썬을 사용할 것입니다. 좋은 소식은 JMP18이 JMP에서 파이썬 스크립트를 직접 실행할 수 있다는 것입니다. 이것은 당신이 원하는 것을 하는 파이썬 스크립트가 될 것입니다:
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자리 이상을 얻으려면 JMP를 숫자 값에 float128을 사용하여 다시 컴파일해야 하며, 이로 인해 시스템 메모리를 더 많이 사용하게 됩니다. 이것이 중요하다면 기능 요청으로 제출할 수 있습니다. 여기에서 할 수 있습니다: 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 값을 분할하거나 문자열로 저장하는 것이 모든 숫자를 보존하는 유일한 방법입니다. JMP의 모든 숫자 값은 C++의 float64 변수의 제한으로 인해 17자리로 제한됩니다. Python은 숫자 값이 64비트나 128비트로 제한되지 않는다는 의미에서 무제한 정밀도를 가지고 있지만, RAM이 지원하는 한 값을 저장하는 데 필요한 만큼 많은 비트를 사용할 수 있습니다.
Re: hextonumber가 64비트에서 작동하지 않음네, 우리는 그것을 위해 파이썬을 통합했습니다.
여러분의 의견에 감사드립니다.