为什么ZeroBrane工作室在功率为双倍

时间:2016-10-11 10:51:52

标签: lua double pow

一般来说,我有以下情况。我写了一个“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这一事实有关。奇怪的是,当权力论证是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

任何答案都将不胜感激!

1 个答案:

答案 0 :(得分:2)

在您的第一个代码中

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

正在计算的表达式为(-198)^1.01 根据{{​​3}}并且根据nan的手册页,它是pow()

  

pow(x,y)返回NaN并引发有限x<的无效“浮点异常。 0和有限非整数y。

在你的第二个代码中

local a = (-198^1.01)

根据math definition of raising to power,表达式为-(198^1.01) 这个表达式等于-208.75 ......

您可能希望计算math.abs(x)^y * (x<0 and -1 or 1)而不是x^y