Lua中的数字最大值是多少?

在文档中似乎没有明确的答案。

我有兴趣增加一个变量 time,它从程序启动以来计算秒数。如果最大值可以计算很远的未来,比如100年,那么我不介意让变量永远增加。否则,我将不得不考虑一个好的时间点,将 time 重置为0。

原文链接 https://stackoverflow.com/questions/945731

点赞
stackoverflow用户22459
stackoverflow用户22459

我在 lua 用户网站上找到了这封电子邮件

Lua 核心不使用 64 位数据类型,除了隐含地使用 size_tptrdiff_t(这在 64 位系统上是 64 位的)。

sizeof( float ) == 4

sizeof( double) == 8

您可以将 lua_Number 定义为 double(默认)、float 或至少有 32 位的任何整数。不过,这会产生一些副作用,并且由于浮点数或整数的范围有限,一些扩展可能无法工作。不过,核心应该没问题。

2009-06-03 16:35:54
stackoverflow用户11649
stackoverflow用户11649

默认情况下,Number 是一个 double 类型,在大多数编译器上它是 IEEE 64 位浮点数。这意味着有 10 位指数,因此最大数字大约是 2^1024,或者说是 5.6e300 年。这是一个漫长的时间。

现在,如果你想递增它,你可能更关心整数范围。52 位尾数意味着可用于整数精度的最大数字是 2^52,约为 4.5e15。每年 31,557,600 秒,那就是 1.427e8,几乎是 1.5 亿年。对于任何进程来说,这仍然是一个非常长的正常运行时间。

更新于 2014-12-30:Lua 5.3(将随时发布)增加了对整数值的支持,可以通过编译标志选择 32 位或 64 位。

2009-06-03 17:13:31
stackoverflow用户68204
stackoverflow用户68204

虽然 tydok 关于 PiL 2.3 的参考是正确和合适的,而 Javier 的回答是实际上正确的,但我认为 Lua 中关于数字的讨论应该补充一些其他的细节。

Lua 解释器被设计为嵌入到一个应用程序中,通常作为配置和/或脚本语言。当为一个应用程序构建时,通常会配置一些功能以适应需求。

用于数字的确切数字类型可供配置。当编译为无硬件浮点数的平台(特别是在嵌入式系统或机顶盒游戏机应用程序中),而加载第三方模块并不重要时,选择整数类型而不是默认的 double 是合理的。偶尔,切换到 float 也是合理的。

但是,有些应用程序需要使用 64 位整数,或者大多数数字可以是整数,但偶尔需要浮点运算。对于这些情况,Lua 核心中有 LNUM patch

LNUM 更改了核心,以便将数字存储为整数或浮点数,并允许对每个数字的精度进行多个可配置的选择。

因此,关于 Lua 数字的最大值的最终答案取决于编译时所选择的解释器的配置,以及您是否担心可表示的最大幅度或最大整数。即使如此,也已经进行了大量工作,使大整数与浮点表示相协调。

2009-06-03 23:08:41
stackoverflow用户7140551
stackoverflow用户7140551

使用 Lua5.1 或 Lua5.2

最大格式化数字:

 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

如果更改末尾的 68 为 69,它仍然只显示 68。 一个大于上面数字的数字会返回 math.huge,也就是 inf。

它等于:1.8x10^308 或者略小于 2^1024。

请自行尝试:

print(string.format("%.0f",number))
2016-12-07 12:00:13
stackoverflow用户9756558
stackoverflow用户9756558

这是在其他答案中提到的最高值。这就是 1.8e308 来自的地方:

HighestNumber = 0
for i = 971, 1024 do
    HighestNumber = HighestNumber + (2 ^ i)
    print(HighestNumber)
end

LuaJIT result

2018-05-08 07:39:02
stackoverflow用户3759024
stackoverflow用户3759024

我遇到了这个问题,因为我自己也有一个非常相似的问题。我目前正在使用 LÖVE2D 进行编程,它使用基于 Lua 5.1 的 _LuaJIT_,因此没有整数。我的问题是:我是否可以使用单个变量来跟踪时间?

对于时间,除了知道哪个值最大之外,您首先应该问自己的是,所需的精度级别是多少,例如需精确到毫秒、厘米或十分之一秒(1、10或100毫秒)。或者是秒。为什么?

请注意,即使您理论上可以使用 Lua 5.1 数值限制(约为 2^1024) 将数千年相加成秒,问题在于,在经过一些非常长久的时间之后(但这都取决于您的边界,如果您正在处理天文应用程序会怎样呢?)你对不同时刻的区分会急剧下降……

>t = 2^1023
>print(t)
8.9884656743116e+307
>print(t+1) -- 让我们假设您的 delta t 为 1 秒
8.9884656743116e+307

因此,在某个时刻,甚至秒的差异也变得毫无意义。因此,我的建议是直接检查您的限制与所需的精度级别。

>a,b = 0,0.1 -- 精度为100毫秒
>while a~=b do a,b = b,b+1 end
interrupted!

我甚至没有等到找到极限,我只是中断了循环,而在不断添加 0.1 到前一个时刻的基准值 a 时,改变了基值。

>print(a/60/60/24/365) -- 检查当前年限制!
251.54387084919

因此,在 Lua 5.1LuaJIT使用单个变量跟踪时间绝对安全。个人而言,由于我正在编写通用框架,我更喜欢从秒开始划分较小的分数来保证最大精度。

2023-01-27 07:20:02