1

我正在尝试为我的 TI-Nspire CX CAS 创建一个简单的二次公式程序。我似乎一切都正确,并且可以在计算机上运行:在此处输入图像描述

但是,它不适用于计算器。我得到第二个正确,但第一个是-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

为什么我在计算器上得到的答案与在电脑上得到的答案不同?我该如何解决这个问题?

提前致谢!

4

2 回答 2

1

What Egor is trying to say is that computers do not calculate exact answers most of the time.

Texas Instruments deals primarily in the micro-controllers so I wouldn't expect the usual x86-64 processor inside that device of yours. That means TI can do a whole lot of things in their own way. They may make own decisions on how to handle small values, rounding, how to handle complex mathematical operations etc...

Computers use at least 32 bit floating point numbers these days. This page gives precision (number of bits before e^-16 that are correct in the machine representation). For 32 bits that value is 24. I couldn't find much info on the calculator, except the wiki page, which says its precision is 14. More than half-float less than float, not defined in that IEEE standard.

That sqrt over there is a nasty function. Computing its value requires quite a lot of computations. Lots of steps means lots of arithmetic errors, the lower precision the further from true value it gets. This also depends on the exact algorithm chosen in the sqrt function. You could check whether the math.sqrt(4^2) returns what it should return and whether math.sqrt(4^2))/(2*4) return exactly half of that.

Battling with numerical errors in computations is an entire discipline on its own and recipes differ depending on what equation you are tackling. There's this post considering the quadratic equations.

Or maybe in your case you'll be happier with just discarding all but few numbers after the decimal point in the final answer.

于 2018-05-13T14:05:14.427 回答
0

正如 Dimitry 所指出的,我必须编写一个 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

我希望这有帮助!

于 2018-05-13T14:55:41.960 回答