好的,首先,这不适用于课堂,考试或其他学生类型的活动。
我是一个游戏的脚本编写者,我正在尝试实现所有人都可以使用的数学库,不幸的是,我所拥有的只是非常基本的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,这似乎是用多种语言完成的。如果我能弄明白我做错了什么,我可以解决它们。
编辑:纠正错字
答案 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
>