2017-11-14 15 views
1

숫자 (64 비트 배정도)를 두 개의 정수 (부호없는 32 비트)로 변환하고 싶습니다. 그것은 정밀 손실없이 할 수 있습니까? 64 비트 숫자는 2 개의 32 비트 숫자에 맞아야하는데, 루아에서 어떻게해야하는지 알 수 없습니다.64 비트 부동 소수점 숫자를 <2^32로 다시 변환하고 루아에서 돌아옴 5.1

LuaJIT에서 bitop 라이브러리로 실험 한 결과 아무것도 유용하지 않았습니다. 숫자를 unsigned long long으로 캐스팅하고 ffi API를 사용하여 순수 루아 코드에서 그 숫자를 분할 할 수 있습니까?

아마도 정밀 손실 없이는 불가능합니다. 내가 정밀도를 잃더라도 그것을하는 합리적인 방법은 무엇입니까?

답변

3

사용 LuaJIT은 : ​​

local ffi = require"ffi" 
local u = ffi.new"union{uint32_t i[2]; double d;}" 
-- convert double into pair of int32 
u.d = 1/3 
print(("%x %x"):format(u.i[0], u.i[1])) --> 55555555 3fd55555 
1

당신은 math.frexp를 사용하여 이중의 IEEE 754 표현의 바이트를 추출하고 math.ldexp를 사용하여 바이트의 수를 재 구축 할 수 있습니다.

packers.doubleunpack_double을 참조하십시오.

http://lua-users.org/lists/lua-l/2015-03/msg00159.html에서 간단한 코드를 사용해보십시오.

+0

https://stackoverflow.com/questions/14416734/lua-packing-ieee754-single-precision-floating-point-numbers를 참조하십시오. – lhf