一般来说,我有以下情况。我写了一个“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
任何答案都将不胜感激!
答案 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