I am attempting to create a simple quadratic formula program for my TI-Nspire CX CAS. I seem to have everything correct, and it works on the computer:
但是,它在计算器上不起作用。我得到的第二个是正确的,但第一个是 -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
为什么我在计算器上得到的答案与在计算机上得到的答案不同?我该如何解决这个问题?
提前致谢!
叶戈尔想说的是,计算机不计算准确答案 https://en.wikipedia.org/wiki/Floating-point_arithmetic大多数时候。
德州仪器 (TI) 主要从事微控制器业务,因此我不认为您的设备中会使用常见的 x86-64 处理器。这意味着 TI 可以用自己的方式做很多事情。他们可能会自己决定如何处理小值、舍入、如何处理复杂的数学运算等......
如今计算机至少使用 32 位浮点数。这一页 https://en.wikipedia.org/wiki/Machine_epsilon给出精度(之前的位数e^-16
在机器表示中是正确的)。对于 32 位,该值为24
。我在计算器上找不到太多信息,除了维基页面 https://en.wikipedia.org/wiki/TI-Nspire_series,这表示它的精度是14
。比 float 少半个以上浮点数,IEEE 标准中未定义。
That sqrt
那边有一个令人讨厌的功能。计算其值需要相当多的计算 https://en.wikipedia.org/wiki/Methods_of_computing_square_roots。大量的步数意味着大量的算术错误,精度越低,与真实值的距离就越远。这也取决于在中选择的确切算法sqrt
功能。您可以检查是否math.sqrt(4^2)
返回它应该返回的内容以及是否math.sqrt(4^2))/(2*4)
正好返回一半。
与计算中的数值误差作斗争本身就是一门完整的学科,并且根据您要处理的方程不同,方法也会有所不同。
有这个帖子 https://math.stackexchange.com/a/2007723考虑二次方程。
或者,在您的情况下,您可能会更乐意在最终答案中丢弃小数点后除少数数字之外的所有数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)