计算机和计算器上的Lua程序不同

我试图为我的TI-Nspire CX CAS创建一个简单的二次公式程序。 我似乎一切都正确,计算机上可以正常工作:enter image description here

然而,在计算器上它不起作用。 第二个正确,但第一个是-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

为什么计算器上的答案与计算机上不同?如何解决这个问题?

提前感谢!

点赞
用户4687565
用户4687565

Egor 想要说的是,计算机大部分时间无法计算出精确的答案

德州仪器主要经营微控制器,所以我不会期望在你的设备中看到通常的 x86-64 处理器。这意味着 TI 可以以自己的方式做很多事情。他们可能对如何处理小值、舍入、如何处理复杂数学运算等做出自己的决策......

现在,计算机使用至少 32 位的浮点数。这个页面给出了精度(机器表示中在e^-16之前正确的位数)。对于 32 位,该值为 24。我在计算器上找不到太多信息,除了 维基页面,它说其精度为14。半精度小于单精度,该 IEEE 标准中没有定义。

那里的 sqrt 是一个令人讨厌的函数。计算它的值需要相当多的计算。许多步骤意味着许多算术错误,精度越低距离真实值越远。这还取决于在 sqrt 函数中选择的确切算法。您可以检查 math.sqrt(4^2) 返回了应该返回的内容,以及 math.sqrt(4^2))/(2*4) 是否确切地返回了其一半。

在计算中战斗数值误差是一门完整的学科,而配方取决于您要解决的方程。有这篇文章研究了二次方程。

或者在您的情况下,您可能会更愉快地只舍弃最终答案小数点后的少数数字。

2018-05-13 14:05:14
用户8866053
用户8866053

正如 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-13 14:55:41