What is the maximum value of a number in Lua?

2019-01-22 20:14发布

There doesn't seem to be a clear answer to this in the documentation.

I'm interested in incrementing a variable time that counts the seconds since the program started. If the maximum value can count far into the future, like 100 years, then I don't care about letting the variable increment forever. Otherwise I'm going to have to think of a good point to reset time back to 0.

标签: time lua numbers
5条回答
贪生不怕死
2楼-- · 2019-01-22 20:22

I found this email on the lua users site

The Lua core does not make use of 64 bit datatypes, except implicitly through size_t or ptrdiff_t (which happen to be 64 bit on a 64 bit box).

sizeof( float ) == 4
sizeof( double) == 8

You can define lua_Number to be a double (default), float or any integer with at least 32 bits. There are side effects though and some extensions may cease to work due to the limited range of floats or ints. The core should be fine, though.

查看更多
看我几分像从前
3楼-- · 2019-01-22 20:28

This is the highest value mentioned in a few other answers. This is where the 1.8e308 comes from:

local HighestNumber = 0
for i = 971, 1023 do
    HighestNumber = HighestNumber + (2 ^ i)
end

I don't have enough reputation to post images, but obviously this can be expressed as a sigma sum.

查看更多
霸刀☆藐视天下
4楼-- · 2019-01-22 20:29

Using Lua5.1 or Lua5.2

Maximum formatted number:

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

If you change the 68 to 69 at the end it still only shows 68. A number larger than the number above returns math.huge aka inf.

Which is equal to: 1.8x10^308 or just south of 2^1024.

Try it yourself:

print(string.format("%.0f",number))
查看更多
Deceive 欺骗
5楼-- · 2019-01-22 20:31

Although tydok's reference to PiL 2.3 is both correct and apropos, and Javier's answer is in practice correct, I thought the discussion of numbers in Lua should be rounded out with a couple of other details.

The Lua interpreter is designed to be embedded in an application typically as a configuration and/or scripting language. When built for an application, it is common to configure some of its features to suit.

The exact numeric type to use for numbers is available for configuration. When compiling for a platform without hardware floating point where loading third-party modules is not important (especially in an embedded system or set-top box game console application) then it is reasonable to pick an integral type instead of the default double. Occasionally, switching to float is reasonable also.

However, there are applications where 64-bit integers are needed, or most numbers can be integers but occasional floating point arithmetic is required. For those cases, there is the LNUM patch to the Lua core.

LNUM changes the core so that numbers are stored as either integers or floating point, and allows several configurable selections for the precision of each.

So the bottom line answer to the question of the maximum value of a Lua number is that it depends on the configuration of the interpreter chosen at compile time, and whether you are worried about the maximum magnitude representable or the maximum integer. And even then, work has been done to make large integers play well with floating point representations.

查看更多
时光不老,我们不散
6楼-- · 2019-01-22 20:33

as compiled by default, the Number is a double, on most compilers that's an IEEE 64-bit floating point. that means 10bit exponent, so the maximum number is roughly 2^1024, or 5.6e300 years. that's a long time.

now, if you're incrementing it, you might be more interested in the integer range. the 52-bit mantissa means that the highest number that can be used with integer precision is 2^52, around 4.5e15. At 31'557,600 seconds/year, that's 1.427e8, almost 150 million years. still a very long uptime for any process

update 2014-12-30: Lua 5.3 (to be released any moment now) adds support for integer values, either 32 or 64 bits chosen via compile flags.

查看更多
登录 后发表回答