lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


On Tue, May 29, 2012 at 10:03:16AM -0700, Paul K wrote:
> Hi All,
> 
> I've been working on a simple serialization module (yes, I carefully
> reviewed the implementations listed here
> http://lua-users.org/wiki/TableSerialization) and came across an issue
> with math.huge. tostring(math.huge) returns "1.#INF", but this value
> isn't interpreted as a valid number (when I'm loading the generated
> string with loadstring). It seems like these values (+/-math.huge)
> need to be treated as special cases, but I don't see this logic in any
> of the modules I reviewed (including those that aim to provide a
> complete serialization solution).

How the C library converts inf to a string and back again is a shadowy
corner of the spec.  Under glibc, this works fine, returning the string
'inf':

 > =tostring(math.huge)
 inf
 > =tonumber "inf"
 inf

Similar problems will exist for NaN, I suspect.

The simple solution is to set up some variables containing inf, -inf,
nan, and -nan, and then use them to compare every number to check for
these special cases.

inf = 1/0
-inf = -1/0

Then, you can see if there's a math.huge to deal with by seeing if the
number equals inf (or math.huge, as it happens), and the opposite
problem with -inf (and encode it as -1/0).

NaN is a bit trickier: if a number is not equal to itself, then it is
NaN.  You can encode this as 0/0.   (ie: if foo ~= foo then ... end)

B.