Lua by default uses a double precision floating point (double) type as its only numeric type. That’s nice and useful. However, I’m working on software that expects to see 64bit integers, for which I don’t get around using actual 64bit integers one way or another.
The place where the integer type becomes relevant is for file sizes. Although I don’t truly expect to see file sizes beyond what Lua can represent with full “integer” precision using a double, I want to be prepared.
What strategies can you recommend when using a 64bit integer type in parallel with the default numeric type of Lua? I don’t really want to throw the default implementation overboard (and I’m not worried of its performance compared to integer arithmetics), but I need some way of representing 64bit integers up to their full precision without too much of a performance penalty.
My problem is that I’m unsure where to modify the behavior. Should I modify the syntax and extend the parser (numbers with appended LL or ULL come to mind, which to my knowledge doesn’t exist in default Lua) or should I instead write my own C module and define a userdata type that represents the 64bit integer, along with library functions able to manipulate the values? …
Note: yes, I am embedding Lua, so I am free to extend it whichever way I please.
As part of LuaJIT’s port to ARM CPUs (which often have poor floating-point), LuaJIT implemented a “Dual-number VM”, which allows it to switch between integers and floats dynamically as needed. You could use this yourself, just switch between 64-bit integers and doubles instead of 32-bit integers and floats.
It’s currently live in builds, so you may want to consider using LuaJIT as your Lua “interpreter.” Or you could use it as a way to learn how to do this sort of thing.
However, I do agree with Marcelo; the 53-bit mantissa should be plenty. You shouldn’t really need this for a good 10 years or so.