Lua如何处理整数和浮点数?


11

据我记得自己编程时,我曾被教过不要比较浮点数是否相等。现在,在阅读有关Lua 类型的Lua编程时number,我发现了以下内容:

数字类型表示实数(双精度浮点数)。Lua没有整数类型,因为它不需要它。人们对浮点算术错误普遍存在误解,有人担心即使是简单的增量也会对浮点数产生怪异。事实是,当您使用双精度数表示整数时,根本没有舍入错误(除非数字大于100,000,000,000,000)。具体来说,Lua数可以表示任何长整数而没有舍入问题。而且,大多数现代CPU进行浮点运算的速度与整数运算一样快(甚至更快)。

所有语言都正确吗?基本上,如果我们不超过双精度浮点数,那么使用整数算术安全吗?或者,为了更符合问题标题,Lua对它的number类型有什么特殊之处,以便它既可以用作整数类型又可以用作浮点类型吗?



@JoonasPulakka谢谢,这是非常有价值的补充。
Petr Abdulin 2013年

Answers:


11

Lua声称浮点数可以像整数类型一样精确地表示整数,我倾向于同意。小数部分没有精确的表示要处理。无论是将整数存储为整数类型,还是将其存储在浮点数的尾数中,结果都是相同的:只要不超过尾数位数,该整数就可以精确表示,指数的1位。

当然,如果您尝试在浮点表示形式中存储实际的浮点数(例如12.345),则所有选项都将关闭,因此您的程序必须清楚该数字是真正的整数,不会溢出尾数,以便将其视为实际整数(即,比较相等性)。

如果您需要的整数精度更高,则始终可以使用任意精度库

进一步阅读
Lua中数字的最大值是多少?


他们的第二个参数呢?也就是说,浮点数与现代CPU中的整数运算一样快或更快?即使使用浮点数执行整数运算,这对我来说还是令人怀疑的。
Andres F.

2
@AndresF。我看不出它的速度如何,除非您通过使用单个数字类型而不是两个数字类型来消除类型转换。
罗伯特·哈维

同意 对我来说没有任何意义。我想知道它是否脱离上下文了……
Andres F.

1
足够大的整数不能完全存储在浮点对象中。64位double大约有51个尾数位;大于约2 ** 51的奇数整数将具有舍入误差。64位整数可以精确存储较大的整数值,因为它不会将任何位分配给指数。
基思·汤普森

@KeithThompson:我说“存储在尾数中”时,这暗示了我的答案。但是,我将编辑答案进行澄清。
罗伯特·哈维

6

双精度数存储为尾数和指数。请参阅格式以获取更多信息。基本上,所有数字的形式为:尾数* 2 指数。对于任何小于2 52的整数,指数将为零,从而使尾数逐位等效于52位无符号整数。单独的符号位用于指示负数。

事实上,即便是一些整数大于2 52,可以精确表示,只要所有过去52个位数ND是零。另外,某些分数(例如0.5)可以精确表示。仅当小数在基数2中连续重复(如1/3)时,否则需要超过基数的位数过多而导致精度下降。


这不是因为不断重复小数。这是因为许多十进制数(以10为底)不能精确表示为2的幂。
罗伯特·哈维

3
在基数2中,无法准确表示的数字不断重复。例如,十进制的0.1十进制变为二进制的0.0(0011),而0011则不断重复。
Karl Bielefeldt

3
对,就是这样。但不是在基座10重复在基座2重复
罗伯特哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.