我希望使用Lua(它内部仅使用双精度浮点数)来表示一个整数,该整数在0到2^64-1之间不能发生舍入误差,否则会发生可怕的事情。
这种做法是否可行?
我希望使用Lua(它内部仅使用双精度浮点数)来表示一个整数,该整数在0到2^64-1之间不能发生舍入误差,否则会发生可怕的事情。
这种做法是否可行?
不行
至少要使用一些64位双精度浮点数的位来表示指数(二进制小数点的位置),因此可用于实际数字的位数不到64位。因此,不,64位双精度浮点数不能表示所有64位整数可以表示的值(反之亦然)。
双精度浮点数本身是一个64位类型。然而,你会失去1个比特用于符号和11个比特用于指数。
所以答案是否定的:无法完成。
总比特数 - 符号比特数 - 指数比特数 + 隐式比特数 = 64 - 1 - 11 + 1 = 53
。 - Christoph记忆中,double
可以完全表示一个53位有符号整数。
在64位系统中,您只能存储2^64个不同的代码。这意味着,一个可以表示2^64个整数的64位类型没有任何地方来表示其他东西,比如浮点数。
显然,双精度浮点数可以表示很多非整数,因此它无法满足您的要求。
IEEE 754双精度浮点数无法准确表示64位整数。但是,它可以准确地表示每个32位整数值。
我对Lua一无所知
但如果你能够找出如何在这种语言中执行浮点数的位运算,理论上你可以创建一个包装类,将你以字符串形式给出的数字设置为浮点数的位,以表示你给出的数字
更实际的解决方案是使用一些大数库