使用相等运算符比较lua中的数字有多安全?

使用相等运算符比较lua中的数字有多安全?,lua,numbers,double,equality,Lua,Numbers,Double,Equality,在我的引擎中,我有一个用于脚本编写的luavm。在脚本中,我编写了如下内容: stage = stage + 1 if (stage == 5) then ... end 及 根据Lua的来源,Lua在比较double(它使用的内部数字类型)时使用一个简单的相等运算符 我知道在处理浮点值时会出现精度问题,所以我想知道比较是否安全,也就是说,使用Lua的默认“==”操作简单地比较这些数字会有任何问题吗?如果是这样的话,我可以采取什么对策来确保1+2总是等于3?将值转换为字符串是否有效?在某些情况

在我的引擎中,我有一个用于脚本编写的luavm。在脚本中,我编写了如下内容:

stage = stage + 1
if (stage == 5) then ... end

根据Lua的来源,Lua在比较double(它使用的内部数字类型)时使用一个简单的相等运算符


我知道在处理浮点值时会出现精度问题,所以我想知道比较是否安全,也就是说,使用Lua的默认“==”操作简单地比较这些数字会有任何问题吗?如果是这样的话,我可以采取什么对策来确保1+2总是等于3?将值转换为字符串是否有效?

在某些情况下,对双精度进行比较和基本操作是安全的。特别是如果数字及其结果可以精确表示,包括所有低值整数

所以双打可以用
2+1==3


注释:我相信对于某些数学函数(如<代码> POW和<代码> SqRT < /C> >,甚至有一些保证,如果编译器/库尊重那些代码,则>代码> Sqt(4)=2 < /COD>或<代码> 4=POW(2.02.0)< /C> >将是可靠的。

< P>默认情况下,Lua是用C++浮点编译的,而幕后数字比较归结为c/c++中的浮点比较,这确实是有问题的,并在几个线程中讨论过,例如

LUA通过将所有数字(包括C++整数)转换成浮点,使得情况稍微恶化。因此,您需要记住这一点。

如果您只关心某些情况下的相等性,那么最好将其转换为字符串,然后比较结果。例如:

> print(21, 0.07*300, 21 == 0.07*300, tostring(21) == tostring(0.07*300))
21      21      false   true
当我给我的学生布置一个包含这些数字(0.07和300)的作业,并要求他们实施一个单元测试时,我学到了这一点,但不幸地失败了,因为我抱怨21不等于21(这是比较实际数字,但显示了严格化的值)。这是我们讨论比较浮点值的一个很好的理由

我可以确保1+2总是等于3


Lua中的数字类型是
double
,它可以精确地容纳比
long int
多得多的整数

这个例子可能重复,这就是为什么在计算值上使用math.floor()是一个很好的理由,因为精度可能是一个问题,也不重要。那么我是否可以保证运算n+m==q对于double(其中n、m和q是整数值,q<100)始终为真?是的,其中q<4503599627370496(即4.5万亿次方).那么,
tonumber(“5”)
调用是否会给我一个可以安全地用于整数运算的值?就
strod
而言。所以,是的。
> print(21, 0.07*300, 21 == 0.07*300, tostring(21) == tostring(0.07*300))
21      21      false   true