我想使用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库
以上就是c/c++开发分享可以使用双精度来表示64位数而不会丢失精度相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560071.html