我试图为我的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
为什么我在计算器上得到不同的答案而在计算机上得到不同的答案?我怎样才能解决这个问题?
提前感谢!
发布于 2018-05-13 14:55:41
正如迪米特里所指出的,我必须从本质上写一个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:05:14
埃戈尔想说的是,大多数时候计算机都是不要计算精确的答案的。
德州仪器公司主要经营的是微控制器,所以我不希望你的设备内有通常的x86-64处理器。这意味着TI可以用自己的方式做很多事情。他们可以就如何处理小值、四舍五入、如何处理复杂的数学运算等问题作出自己的决定。
计算机现在至少使用32位浮点数。此页给出了精度( e^-16
之前的位数在机器表示中是正确的)。对于32位,该值为24
。我在计算器上找不到多少信息,除了wiki页面,它说它的精度是14
。超过一半的浮动小于浮动,在IEEE标准中没有定义.
那边的sqrt
是个讨厌的函数。计算其值需要大量的计算。许多步骤意味着大量的算术误差,精度越低,得到的真值越远。这也取决于在sqrt
函数中选择的精确算法。您可以检查math.sqrt(4^2)
是否返回它应该返回的内容,以及math.sqrt(4^2))/(2*4)
是否返回其中的一半。
在计算中与数值误差作斗争本身就是一个完整的学科,根据你所处理的等式,食谱也不同。有考虑二次方程的这个职位。
或者,在你的情况下,你会更快乐,因为在最后答案的小数点之后丢弃了所有的数,但只有很少的数。
https://stackoverflow.com/questions/50310056
复制相似问题