Программа Inpaired Lua отличается от компьютера и калькулятора - PullRequest
0 голосов
/ 12 мая 2018

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

Однако на калькуляторе это не работает. Я правильно понял второй, но 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 ]

0 голосов
/ 13 мая 2018

Как отметил Дмитрий, я должен написать, по сути, движок 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

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

0 голосов
/ 13 мая 2018

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

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

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

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

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

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

...