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

时间:2009-11-24 11:16:18

标签: c floating-point lua double

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

有可能这样做吗?

8 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

double是64bit类型。但是你的符号丢失1位,指数丢失11。

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

答案 3 :(得分:3)

从内存中,double可以完全代表53位有符号整数。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

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