All pastes #113023 Raw Edit

ckknight

public lua v1 · immutable
·published 2006-08-03 09:51 UTC
rendered paste body
local floor = math.floorlocal mod = math.modlocal char = string.charlocal log = math.loglocal log2 = log(2) function Serialize(num)        local sign = num < 0        if sign then                num = -num        end        local exp = floor(log(num)/log2)        local mantissa = (num / 2^exp - 1) * 4503599627370496        local x = (exp + 1023) * 4503599627370496 + mantissa        if sign then                x = x + 9223372036854775808        end        return char(x / 72057594037927936, mod(x / 281474976710656, 256), mod(x / 1099511627776, 256), mod(x / 4294967296, 256), mod(x / 16777216, 256), mod(x / 65536, 256), mod(x / 256, 256), mod(x, 256))end function Deserialize(code)        local a = string.byte(code, 1)        local b = string.byte(code, 2)        local c = string.byte(code, 3)        local d = string.byte(code, 4)        local e = string.byte(code, 5)        local f = string.byte(code, 6)        local g = string.byte(code, 7)        local h = string.byte(code, 8)        local x = a * 72057594037927936 + b * 281474976710656 + c * 1099511627776 + d * 4294967296 + e * 16777216 + f * 65536 + g * 256 + h        local mantissa = 1 + mod(x, 4503599627370496) / 4503599627370496        local exp = mod(floor(x / 4503599627370496), 2048) - 1023        local val = 2^exp * mantissa        if floor(x / 9223372036854775808) == 1 then                return -val        end        return valendfunction Test(num)	local after = Deserialize(Serialize(num))	if math.abs(num - after) > 0.00000000001 then		print(num .. " -> " .. after)	endendfor i = 1, 1000 do	local num = math.random() / math.random()	Test(num)end