3 ms·
In Lua < 5.3 a = 9223372036854775000 is not even valid code. Because only 32-bit integer values are supported. In Lua < 5.3 the value is immediately corrup
by copx 10y ago
In Lua < 5.3
a = 9223372036854775000
is not even valid code. Because only 32-bit integer values are supported.
In Lua < 5.3 the value is immediately corrupted (check the value of 'a' after the initial assignment) and static analysis can detect that line as a bug.
In contrast in Lua 5.3 it is perfectly fine code and the value of 'a' will be 9223372036854775000 as one would expect. However the moment you - maybe accidentally - mix that int64 variable with a float64 variable in an expression you end up with a (silent) bug.
Such bugs will happen. They happen all the time in C and in Lua's case things are even worse because function parameters do not have types. The possibilities of hard to find, nasty bugs are endless here. E.g. simply forgetting the second '/' in '//' in one part of the program can cause bugs in a completely different part, maybe even in a third party module, and only under certain circumstances.
- Franciscouzo 10y ago"In Lua < 5.3 a = 9223372036854775000 is not even valid code. Because only 32-bit integer values are supported." That's not true at all, Lua < 5.3 uses doubles for all numbers, which on most computers is IEEE 754, they can represent integers perfectly up to 2^53 The value is not corrupted, depending on the rounding mode is which number you're going to get out of that (I get 9223372036854774784)
- copx 10y ago>That's not true at all, Lua < 5.3 uses doubles for all numbers I know that of course, but using doubles for integer math is only safe if you limit yourself to a certain integer range. >which on most computers is IEEE 754, they can represent integers perfectly up to 2^53 False. You get rounding errors after 10^14. >The value is not corrupted, depending on the rounding mode is which number you're going to get out of that (I get 9223372036854774784) The above being an example of such a rounding error. If I assign the value 9223372036854775000 to a variable I expect said variable to afterwards have the value 9223372036854775000 not 9223372036854774784. Your example is exactly what I meant with "corrupted" i.e. the value is changed by the conversion.