为什么 ZeroBrane studio 在幂为双倍时将“^”评估为不是数字
Why does ZeroBrane studio evaluates "^" as not a number when the power is a double
嗯,一般来说,我有以下情况。我写了一个 "main.lua" 文件,其中包含另一个文件,其对象定义具有以下方法:
function self:Process(vRef,vOut,bNeg)
mErrO = mErrN
mErrN = (bNeg and (vOut-vRef) or (vRef-vOut)) -- Refresh error state
logStatus(nil,"MER= "..mErrO.." > "..mErrN)
local errS = getSign(mErrN)
-- P-Term
logStatus(nil,"S P: >> "..tostring(errS))
local errP = mErrN; logStatus(nil,"0 P: >> "..tostring(errP))
errP = errP^mpP; logStatus(nil,"1 P: >> "..tostring(errP))
errP = math.abs(errP); logStatus(nil,"2 P: >> "..tostring(errP))
errP = errP*errS; logStatus(nil,"3 P: >> "..tostring(errP))
大家可能看到了,如果我们有(-198^1.01),结果一定是(分别)(-208.75257542111)。我在 "main.lua" 文件中添加了以下行:
local a = (-198^1.01)
local b = ( 198^1.01)
local c = ( 0^1.01)
logStatus(nil,"-------------Pow: {"..a..","..b..","..c.."}")
但是,这些都是正确计算的。我认为它与对象和 ZeroBrane 必须使用旧版本 Lua 的事实有某种关系。奇怪的是,当 power 参数为 1,2,3,4 时......它工作正常。程序输出如下:
-------------Pow: {-208.75257542111,208.75257542111,0}
MER= 0 > -198
S P: >> -1
0 P: >> -198
1 P: >> nan
2 P: >> nan
3 P: >> nan
任何答案将不胜感激!
在你的第一个代码中
local errP = mErrN; --> -198
errP = errP^mpP; --> nan
正在计算的表达式是(-198)^1.01
。
根据 math definition of raising to power 和 pow()
的手册页,它是 nan
:
pow(x, y) returns a NaN and raises the "invalid" floating-point exception for finite x < 0 and finite non-integer y.
在你的第二个代码中
local a = (-198^1.01)
根据Lua operators precedence表达式为-(198^1.01)
。
此表达式等于 -208.75...
您可能想要计算 math.abs(x)^y * (x<0 and -1 or 1)
而不是 x^y
嗯,一般来说,我有以下情况。我写了一个 "main.lua" 文件,其中包含另一个文件,其对象定义具有以下方法:
function self:Process(vRef,vOut,bNeg)
mErrO = mErrN
mErrN = (bNeg and (vOut-vRef) or (vRef-vOut)) -- Refresh error state
logStatus(nil,"MER= "..mErrO.." > "..mErrN)
local errS = getSign(mErrN)
-- P-Term
logStatus(nil,"S P: >> "..tostring(errS))
local errP = mErrN; logStatus(nil,"0 P: >> "..tostring(errP))
errP = errP^mpP; logStatus(nil,"1 P: >> "..tostring(errP))
errP = math.abs(errP); logStatus(nil,"2 P: >> "..tostring(errP))
errP = errP*errS; logStatus(nil,"3 P: >> "..tostring(errP))
大家可能看到了,如果我们有(-198^1.01),结果一定是(分别)(-208.75257542111)。我在 "main.lua" 文件中添加了以下行:
local a = (-198^1.01)
local b = ( 198^1.01)
local c = ( 0^1.01)
logStatus(nil,"-------------Pow: {"..a..","..b..","..c.."}")
但是,这些都是正确计算的。我认为它与对象和 ZeroBrane 必须使用旧版本 Lua 的事实有某种关系。奇怪的是,当 power 参数为 1,2,3,4 时......它工作正常。程序输出如下:
-------------Pow: {-208.75257542111,208.75257542111,0}
MER= 0 > -198
S P: >> -1
0 P: >> -198
1 P: >> nan
2 P: >> nan
3 P: >> nan
任何答案将不胜感激!
在你的第一个代码中
local errP = mErrN; --> -198
errP = errP^mpP; --> nan
正在计算的表达式是(-198)^1.01
。
根据 math definition of raising to power 和 pow()
的手册页,它是 nan
:
pow(x, y) returns a NaN and raises the "invalid" floating-point exception for finite x < 0 and finite non-integer y.
在你的第二个代码中
local a = (-198^1.01)
根据Lua operators precedence表达式为-(198^1.01)
。
此表达式等于 -208.75...
您可能想要计算 math.abs(x)^y * (x<0 and -1 or 1)
而不是 x^y