众所周知,计算难免会有误差。比如,购物结算时可能会有一点点误差。对于这一点点误差,大家都会接受。但是,当误差变成错误时,大家还会接受吗?
下面是计算机的一些错误计算。
例1. 计算
其中 (注:上式由德国学者 Rump S 给出)。
若使用由 c 语言编制的程序计算上式的值,则不同的精度, 或不同的环境下, 会得到完全不一致的结果。
在IBM 370 计算机的单精度、双精度、扩展精度下计算结果分别是
1.172603,
1.1726039400 531,
1.172603940053178;
在Pentium 4 工作站(GCC, Linux)上, 3 个不同类型下的计算结果依次为
,
,
;
在Sun机器上(Fortran程序)计算, 32位、64位、128位精度下的结果分别为
,
,
。
也许大家会说,这是远古时期的计算机了吧?是的。年代确实早了一点。但是, 很遗憾地告诉大家,即使是现今的计算机,输出也一样。大家不妨在Visual Studio 或GCC下算一下。结果就不说了。因为,环境不一样,错的也不一样。这正应了托尔斯泰老人家的那句话:“不同的环境输出不一样的结果(不幸的家庭各有各的不幸)”。
最后差点忘了说正确答案:。所以,上述计算均是错误的。
例2. 能从Matlab的计算结果获得 1 位正确的有效数字吗?
若在Matlab 中输入 ,则结果是
。事实上, 上式的值应该是
。 所以,从Matlab得不到 1位正确数字。
上述两个错误案例是偶然的吗?仅有的吗?不是的。能随便产生一个计算机会算错的案例吗?答案是:能!
请进入 不可信计算 网址,输入 123,点击 产生 按钮,会输出,比如(我现在是这个)
用C++或Java或其它语言,编程试试。99.99%是错误结果。
更广泛的案例请查看《悬赏万元,用大模型等做算术》。从该悬赏的部分反馈可看出,好多软硬件的计算均会出现错误。
最后总结一句:错误是系统性的,影响范围是广泛的。
例1~2 中内容或涉及的文献请参考:
[1] 赵世忠. 算术表达式的一种可信计算算法及其软件ISReal. 中国科学F辑: 信息科学, 2016, 46(6): 698-713