为什么 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 powerpow() 的手册页,它是 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