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