为什么 ZeroBrane studio 在幂为双精度时会将“^”评估为非数字

正如通常所说的那样,我有以下情况。我写了一个“main.lua”文件,其中包含具有以下方法的对象定义的其他文件:

  function self:Process(vRef,vOut,bNeg)
    mErrO = mErrN
    mErrN = (bNeg and (vOut-vRef) or (vRef-vOut)) -- 刷新错误状态
    logStatus(nil,"MER= "..mErrO.." > "..mErrN)
    local errS  = getSign(mErrN)
    -- P项
    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 有关。奇怪的是,当幂参数为 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

任何答案都将不胜感激!

点赞
用户6834680
用户6834680

在你的第一段代码中

local errP = mErrN;     -->  -198
      errP = errP^mpP;  -->  nan

计算的表达式是 (-198)^1.01

根据 指数函数的数学定义pow() 的 man page,应该返回 nan:

当 x < 0 且 y 是有限数字时,pow(x, y) 返回 NaN 并触发“无效”浮点异常。

在你的第二段代码中

local a = (-198^1.01)

这个表达式应该是 -(198^1.01),根据 Lua 操作符优先级

这个表达式的值等于 -208.75...


也许你想计算 math.abs(x)^y * (x<0 and -1 or 1) 而不是 x^y

2016-10-12 07:22:00