Помощь с Lua Cosine, неправильные результаты вернулись - PullRequest
3 голосов
/ 20 октября 2010

Хорошо, во-первых, это НЕ для класса, теста или другого вида деятельности студента.

Я - сценарист для игры, и я пытаюсь реализовать математическую библиотеку для всех, и, к сожалению, все, что у меня есть, - это очень простой 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 возвращает факториал, который возвращает с точностью до 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

Проблема с этими функциями для печати (math.cos (90)) возвращает 4.77135 ... когда я ожидаю -0.44807 ... (на основе calc в научном режиме или с использованием онлайн-инструмента к cos (90)).

У меня также есть проблемы с грехом и загаром, однако они так же записаны в cos, что, похоже, было сделано во многих языках. Если я смогу понять, что я делаю неправильно, я смогу все исправить.

РЕДАКТИРОВАТЬ: Исправлена ​​опечатка

1 Ответ

3 голосов
/ 21 октября 2010

Во-первых, ваша Луа не бежит.Во-вторых, вам нужно сделать ваши переменные локальными.В-третьих, косинус начинается с one .

. Проблема в том, что используемый ряд Тейлора сходится только к правильным значениям косинуса, близким к нулю.Вам придется использовать гораздо больше терминов серии, чтобы правильно обрабатывать 90.Вы можете исправить это для вашей реализации двумя способами:

Добавить константу pi.Затем используйте цикл while для настройки значения таким образом, чтобы abs (value) <2 * pi: </p>

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

Или - найти или реализовать версию fmod в lua.

Вот исправленный код (вы можете уменьшить его):

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:

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