我对我的图形计算器进行了测试,以检查浮点错误,经过四十八小时的完全随机性后,计算器没有丢失任何一位数字的精度。
TI 如何实现这一目标?
TI-89 和 TI-92 通过使用符号计算来准确地存储值来避免错误。
实际浮点计算(89/92 上的“近似”模式)确实 有错误。它们只是更难被注意到,因为 TI 计算器显示的数字少于其存储的数字。此外,他们使用十进制而不是二进制。
例如,如果您在 TI-89 的“近似”模式下输入表达式
1/3*3-1
,您将得到答案 ⁻1.ᴇ⁻14
,而不是在精确模式下得到的 0
。在内部,计算如下:
1/3
给出 0.33333333333333
,四舍五入到 14 位有效数字。0.99999999999999
。由于四舍五入,这显示为 1.
-0.00000000000001
,或 -1e-14。在流行的 TI-84+ 计算器上实际上存在一些精度误差,尽管它没有其他平台那么突出。
例如:在 JavaScript 和许多其他使用 IEEE-754 二进制浮点的著名编程语言中,0.1+0.2
将导致
0.30000000000000004
。这个特殊的例子在 Texas TI 计算器上并不是一个突出的问题,因为它们使用以 10 为基数的格式,而不是以 2 为基数。但是,TI-84+ 仍然存在精度问题,例如来自
TI Basic Wiki 的示例:
注意精度问题
1/3*3→X // X is expected to be 1 X // Displays 1, but is actually 0.99999999999999 in memory iPart(X) // Displays 0 fPart(X) // Displays 1, but is actually 0.99999999999999 in memory
有点不直观的是,上面的代码显示结果 1、0 和 1。这是因为计算器将值存储为 14 位精度,但将值四舍五入到 10 位以适合主屏幕。因此,
fPart()
可能会返回 1 或 -1 的值。提示: 如果您在列表编辑器屏幕中输入一个值,您将能够看到所有 14 位精度。这可以帮助您解决此类问题。
一种解决方法是在调用
iPart()
或fPart()
之前对数字进行四舍五入,如果您不介意精度从 14 位有效数字到 9 位小数的轻微损失:1/3*3→X iPart(round(X,9)) // Displays the expected result 1 fPart(round(X,9)) // Displays the expected result 0
(这里从技术上讲,参数 9 不是必需的,因为 9 是默认值,但为了清晰起见,并且在您想要自定义精度级别时显示该参数。)