可以使用双精度来表示64位数而不会丢失精度

我想使用lua(内部仅使用双精度)来表示一个整数,该整数不能在0到2 ^ 64-1之间出现舍入误差,否则会发生可怕的事情。

有可能这样做吗?

没有

必须使用64位双精度型的至少一些位来表示指数(二进制点的位置),因此实际数量可用的位数少于64位。 所以不,64位双精度不能代表64位整数的所有值(反之亦然)。

即使你已经对64位类型的问题得到了一些很好的答案,你仍然可能需要一个实际的解决方案来解决你的具体问题。 我所知道的最可靠的解决方案是使用LNUM补丁(也称为Lua整数补丁)构建Lua 5.1,可以从LuaForge下载。 如果您不打算从C源构建Lua,那么至少有一个纯Lua库可以处理64位有符号整数 – 请参阅Lua-users wiki。

双倍是64位类型本身。 但是你的符号丢失1位,指数丢失11。

所以答案是否定的:它无法完成。

从内存中, double可以精确地表示53位有符号整数。

不,你不能使用Double来存储64位整数而不会丢失精度。

但是,您可以应用Lua补丁,该补丁将对真正的64位整数的支持添加到Lua解释器。 将LNUM补丁应用于Lua源并重新编译。

在64位上,您只能存储2 ^ 64个不同的代码。 这意味着可以表示2 ^ 64个整数的64位类型没有任何表示其他内容的位置,例如浮点数。

显然,double可以表示很多非整数数字,因此它不能满足您的要求。

IEEE 754 double不能完全代表64位整数。 但是,它可以精确地表示每个32位整数值。

我对lua一无所知
但是如果你能弄清楚如何用这种语言对float进行逐位操作,你理论上可以创建一个包装类,它以字符串的forms取你的数字,并按照表示数字的顺序设置浮点数你给了它
更实际的解决方案是使用一些bignum库