协助Lua Cosine,错误的结果归来

时间:2010-10-20 19:07:27

标签: math scripting lua cosine

好的,首先,这不适用于课堂,考试或其他学生类型的活动。

我是一个游戏的脚本编写者,我正在尝试实现所有人都可以使用的数学库,不幸的是,我所拥有的只是非常基本的lua。实现的版本无法更改,也不包含任何库。对于那些想知道的人来说,它是用Fold.It。

编写的

这就是我所拥有的......

math={}
math.fact = function(b) if(b==1)or(b==0) then return 1 end e=1 for c=b,1,-1 do e=e*c end return e end
math.pow = function(b,p) e=b if(p==0) then return 1 end if(p<0) then p=p*(-1) end for c=p,2,-1 do e=e*b end return e end
math.cos = function(b,p) e=0 p=p or 10 for i=1,p do e=e+(math.pow(-1,i)*math.pow(b,2*i)/math.fact(2*i)) end return e end

为了澄清上面的内容,math.fact返回factorial,它返回精确到大约10个精度点,并且是我为帮助余弦计算而做的新函数。

math.pow也是一个处理返回功率的新功能,也可按预期工作。

问题在于余弦函数。它回归意外的价值。这是一个更容易理解的版本(我一直在写我的图书馆的东西超瘦)...

function math.cos(value,precision) 
    result=0 
    precision=precision or 10 
    for i=1,precision do 
        result=result+(math.pow(-1,i)*math.pow(value,2*i)/math.fact(2*i)) 
    end 
    return e 
end

问题是,对于那些函数,print(math.cos(90))它返回4.77135 ...当我期待-0.44807 ...(基于科学模式中的calc,或使用在线工具到cos(90))。

我也遇到过犯罪和晒黑的问题,但是他们同样写入cos,这似乎是用多种语言完成的。如果我能弄明白我做错了什么,我可以解决它们。

编辑:纠正错字

1 个答案:

答案 0 :(得分:3)

首先,你的lua不会运行。其次,您需要将变量设为本地变量。第三,余弦以one开头。

问题是因为您使用的泰勒级数仅收敛于接近零的正弦余弦值。您将不得不使用更多的系列术语来使其正确处理90。您可以通过两种方式解决此问题:

添加pi常量。然后使用while循环来调整值,使得abs(值)&lt; 2 * PI:

math.pi = 3.14159265358
while value > math.pi*2 do 
  value = value - math.pi * 2 
end
while value < -math.pi*2 do
  value = value + math.pi * 2
end

或者 - 在lua中找到或实施fmod的版本。

以下是更正的代码(您可以将其缩小):

math={}
math.fact = function(b)
    if(b==1)or(b==0) then
        return 1
    end
    local e=1
    for c=b,1,-1 do
        e=e*c
    end
    return e
end

math.pow = function(b,p)
    local e=b
    if(p==0) then
        return 1
    end
    if(p<0) then
        p=p*(-1)
    end
    for c=p,2,-1 do
        e=e*b
    end
    return e
end
math.cos = function(b,p)
    local e=1 
    b = math.correctRadians(b) 
    p=p or 10
    for i=1,p do
        e=e+(math.pow(-1,i)*math.pow(b,2*i)/math.fact(2*i))
    end
    return e
end

math.pi = 3.1415926545358
math.correctRadians = function( value )
    while value > math.pi*2 do
        value = value - math.pi * 2
    end           
    while value < -math.pi*2 do
        value = value + math.pi * 2
    end 
    return value
end 

交互式lua run:

imac:~ root$ lua -i temp.lua 
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print( math.cos( 90 ) )
-0.44807359244883
>