双精度浮点数能否表示一个64位数字而不失精度?

我想使用 Lua 来表示一个在 0 到 2^64-1 之间不会出现舍入误差或会发生可怕事情的整数(它内部只使用双精度浮点数)。

这可行吗?

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

点赞
stackoverflow用户6604
stackoverflow用户6604

不行

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

2009-11-24 11:19:23
stackoverflow用户71883
stackoverflow用户71883

双精度浮点数是一个64位类型本身。但是,你会失去1个比特用于表示符号,以及11个比特用于表示指数。

因此,答案是否定的:无法做到。

2009-11-24 11:20:32
stackoverflow用户25990
stackoverflow用户25990

我对 Lua 一无所知

但是,如果你能够弄清楚如何在 Lua 中进行位运算,理论上你可以制作一个封装类,接受你以字符串形式给定的数字,并按照代表你给定的数字的顺序设置浮点数的位。

更实用的解决方案是使用一些大数库。

2009-11-24 11:30:37
stackoverflow用户10320
stackoverflow用户10320

从记忆中来说,double 可以精确地表示一个 53 位的有符号整数。

2009-11-24 11:30:39
stackoverflow用户88851
stackoverflow用户88851

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

显然,双精度浮点数可以表示大量的非整数数字,因此不能满足您的要求。

2009-11-24 12:06:07
stackoverflow用户88888888
stackoverflow用户88888888

尽管您已经在关于64位类型的问题上得到了一些好的答案,但您可能仍然需要针对您特定问题的实用解决方案。我知道的最可靠的解决方案是使用LNUM补丁(也称为Lua整数补丁)构建Lua 5.1,可以从LuaForge下载。如果您没有计划从C源代码构建Lua,则至少有一个纯Lua类库可以处理64位有符号整数-请参见Lua-users wiki。

2009-11-24 14:49:55
stackoverflow用户48940
stackoverflow用户48940

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

然而,你可以应用一个 Lua 补丁,将真正的 64 位整数支持添加到 Lua 解释器中。将 LNUM 补丁应用到你的 Lua 源代码上并重新编译。

2009-11-24 21:57:37
stackoverflow用户293933
stackoverflow用户293933

IEEE 754双精度不能精确表示64位整数。但它可以精确表示每一个32位整数值。

IEEE 754 double 不能表示 64 位整数,但可以准确地表示每个 32 位整数值。
2010-04-02 06:17:50