Вдохновленная программа Lua отличается на компьютере и калькуляторе

Я пытаюсь создать простую программу с квадратичной формулой для моего TI-Nspire CX CAS. У меня вроде все правильно, и работает на компьютере: введите описание изображения здесь

Тем не менее, он не работает на калькуляторе. Я правильно понял второй, но 1-й - -4,44089... E-16. (не говорит..., просто использую это, потому что я не хочу печатать все это)

(Упрощенный) код выглядит следующим образом:

function quadraticA(f,s,t)
    return ((-1*s)+math.sqrt(s^2-4*f*t))/(2*f)
end
function quadraticB(f,s,t)
    return ((-1*s)-math.sqrt(s^2-4*f*t))/(2*f)
end
function on.paint(gc)
    formula:setExpression("0s: "..quadraticA(tonumber(a),tonumber(b),tonumber(c)))
    formulaB:setExpression(quadraticB(tonumber(a),tonumber(b),tonumber(c)))
end

Почему я получаю другой ответ на калькуляторе, чем на компьютере? Как я могу исправить проблему?

Заранее спасибо!

2 ответа

Решение

Как отметил Дмитрий, я должен написать, по сути, движок CAS. Вот упрощение квадратного корня в lua:

function factors(a)
    factorsOfA={}
    counter = 0
    for i = 1, a do
        counter = counter + 1
        if modulo(a,i) == 0 then
            factorsOfA[counter]=i
        end
    end
    return factorsOfA
end
function simplifySqrt(radicand)
    radicandFactors = factors(radicand)
    outsideRadicand = 1
    for m,i in pairs(radicandFactors) do
        if math.floor(math.sqrt(i))^2 == i then
            outsideRadicand = outsideRadicand * math.floor(math.sqrt(i))
        end
    end
    insideRadicand = radicand/outsideRadicand^2
    return outsideRadicand.."sqrt("..insideRadicand..")"
end

Надеюсь, это поможет!

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

Texas Instruments в основном занимается микроконтроллерами, поэтому я не ожидал бы, что обычный процессор x86-64 внутри вашего устройства. Это означает, что TI может делать многое по-своему. Они могут принимать собственные решения о том, как обрабатывать небольшие значения, округлять, как обрабатывать сложные математические операции и т. Д...

В наши дни компьютеры используют как минимум 32-битные числа с плавающей запятой. Эта страница дает точность (количество бит до e^-16 которые верны в машинном представлении). Для 32 бит это значение 24, Я не мог найти много информации на калькуляторе, кроме вики-страницы, которая говорит, что ее точность 14, Больше чем наполовину меньше, чем поплавок, не определенный в этом стандарте IEEE.

Тот sqrt там есть противная функция. Вычисление его значения требует довольно много вычислений. Множество шагов означает много арифметических ошибок, чем ниже точность, тем дальше от истинного значения, которое он получает. Это также зависит от точного алгоритма, выбранного в sqrt функция. Вы можете проверить, math.sqrt(4^2) возвращает то, что он должен вернуть и math.sqrt(4^2))/(2*4) вернуть ровно половину этого.

Борьба с числовыми ошибками в вычислениях - это целая дисциплина, и рецепты различаются в зависимости от того, какое уравнение вы решаете. Есть этот пост, рассматривающий квадратные уравнения.

Или, может быть, в вашем случае вы будете счастливы, просто отбросив все, кроме нескольких цифр, после десятичной точки в окончательном ответе.

Другие вопросы по тегам