【问题标题】:How do I limit numbers in Lua while keeping precision?如何在保持精度的同时限制 Lua 中的数字?
【发布时间】:2016-02-01 02:15:47
【问题描述】:

原文:

我需要将两个 64 位数字相乘,但 Lua 正在失去精度 大数字。 (例如 99999999999999999 显示为 1000000000000000000) 相乘后我需要一个64位解决方案, 所以我需要一种方法将解决方案限制为 64 位。 (我知道,如果 解决方案会很精确,我可以使用 % 0x10000000000000000, 这样也可以)

编辑:有了 Lua 5.3 和新的 64 位整数支持,这个问题不再存在。整洁。

【问题讨论】:

    标签: lua numbers limit


    【解决方案1】:

    Lua 使用双精度浮点数进行所有数学运算,包括整数运算(请参阅http://lua-users.org/wiki/FloatingPoint)。这为您提供了大约 53 位的精度,这(正如您所注意到的)比您需要的要少。

    有几种不同的方法可以在 Lua 中获得更高的精度。您最好的选择是找到最积极的此类努力并加以利用。在这种情况下,您的问题已经得到解答;查看What is the standard (or best supported) big number (arbitrary precision) library for Lua?

    如果你的 Lua 发行版有它的包,简单的答案是lmapm

    【讨论】:

      【解决方案2】:

      如果您使用 LuaJIT 代替 Lua,则可以访问所有 C99 内置类型,包括通常为 64 位的 long long

      local ffi = require 'ffi'
      
      -- Needed to parse constants that do not fit in a double:
      ffi.cdef 'long long strtoll(const char *restrict str, char **restrict endptr, int base);'
      
      local a = ffi.C.strtoll("99999999999999999", nil, 10)
      print(a)
      print(a * a)
      

      => 3803012203950112769LL(假设结果被截断为 64 位)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-23
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多