--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
> 写道: >Hello! > >2015-08-22 18:49 GMT+08:00 姚尉: >> 最近用lua处理某些大整数的时候发现不对劲 >> >> 下面这条语句的结果是:10992432728506384 >> print(string.format("%d", 186312419127226*59 + 49)) >> 但是这个算术得到的结果应该是:10992432728506383 >> >> 有人碰到过同样的问题吗? >> 不知道是因为string.format的问题呢,还是说lua本身计算的时候精度导致的,这个结果没有超过long型啊 >> > >在 LuaJIT 中,Lua number 的默认精度上限是双精度浮点数(double)。如果你想进行无精度损失的 64 位整数计算,须使用 >FFI cdata 的包装整数类型。例如,对于你这里的例子: > > local ffi = require "ffi" > local res = ffi.new("int64_t", 186312419127226)*59 + 49) > print(tostring(res) > >使用 LuaJIT 运行这三行 Lua 代码得到的结果是 > > 10992432728506383LL > >正是你期望的值。 > >Regards, >-agentzh > >-- >-- >邮件来自列表“openresty”,专用于技术讨论! >订阅: 请发空白邮件到 openresty...@googlegroups.com
好吧,这可以进一步化简为
$ luajit -e 'print(186312419127226LL*59 + 49)'
10992432728506383LL
不用显式地使用 ffi 模块。貌似这已经足够简单了 :)
> 写道: >Hello! > >2015-08-23 21:06 GMT+08:00 Mike Green: >> PS: 感觉5.3.0之前的lua,就是小孩子的玩具~ >> > >呃,我对此并不敢苟同,呵呵。 > >默认为 number 使用 64-bit 整型对性能损耗很大。比如在标准 Lua 5.3 解释器中,TValue 类型长达 128 位。而在 >LuaJIT 2 中,TValue 只有 64 位。TValue 的长度对一般的 Lua 代码的执行性能影响很大。 > >Regards, >-agentzh > >-- >-- >邮件来自列表“openresty”,专用于技术讨论! >订阅: 请发空白邮件到 openresty...@googlegroups.com
呃,不喜欢 ngx.int64. 感觉这里我们只是需要一个不带 LL 后缀的 tostring() :)
Hello,眼下最方便的还是用 string 来表示 int64
在 2016年6月12日 下午2:36,Chunhui Shi <shichun...@gmail.com>写道:
我目前项目中采用openresty 做后台服务,遇到一个问题就是openresty 内置的lua版本是5.1,默认使用内置的luajit
,都不支持int64, 而且我需要使用cjson 来encode和decode int64,本来想把lua5.3编译到openresty里面,发现编译失败。想问一下,有没有办法把lua5.3编译进openresty里面? 或者有办法是openresty里面的luajit2.1支持int64?春哥,请问这种情况有没有好点的解决办法啊?
On Saturday, August 22, 2015 at 6:49:36 PM UTC+8, 姚尉 wrote:hi,all
最近用lua处理某些大整数的时候发现不对劲
下面这条语句的结果是:10992432728506384
print(string.format("%d", 186312419127226*59 + 49))
但是这个算术得到的结果应该是:10992432728506383
有人碰到过同样的问题吗?
不知道是因为string.format的问题呢,还是说lua本身计算的时候精度导致的,这个结果没有超过long型啊
而且逢9的算术好像都有问题比如:186312419127226*59 + 39
luajit也有同样的问题
lua 版本:5.1.5
luajit版本:2.1.0-alpha
64位操作系统
--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 open...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 open...@googlegroups.com
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
---
您收到此邮件是因为您订阅了Google网上论坛上的“openresty”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到openresty+...@googlegroups.com。
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/openresty/ff878bd3-a677-40f9-ba5c-1ca21d7c76c8%40googlegroups.com。
local str_byte = string.byte
local rest = 0
for i = 1,#str do
local b = str_byte(str, i, i) - 48
rest = (rest * 10 + b) % m
end