我怎么确定我的答案是由于舍入误差误差或错误?

57视图(30天)

接受的答案

MathWorks支万博1manbetx持团队
编辑:MathWorks支万博1manbetx持团队 2021年2月17日
你遇到一个舍入误差,证明了一个基本问题与计算机处理部分数字的方式。一些数字(事实上,“绝大多数”)不能完全以二进制形式表示,具体来说,部分数据,不是两个。这将发生在任何计算机程序使用ANSI / IEEE标准的数学。
MATLAB使用ANSI / IEEE标准754,二进制浮点运算的双精度,所以任何非零数字写在以下表格与0 < = f < 1和整数e:
+或- (1 + f) * 2 ^ e
数量f是分数,或不正式,尾数。量e是指数。f和e必须有限扩张基础2。f的有限自然意味着数字准确性有限所以算术可能涉及舍入误差。e有限的本质意味着数量有限,所以算术可能涉及under-flow和溢出。作为一个结果,你有时会舍入错误将是明显的,但通常不重要。例如,大多数的数字处理可能1.0 e-01附近,大约是1.0 e-16而你的错误。
如果你想仔细看看电脑看到这些数字的方式,尝试使用命令十六进制格式。你会发现数字像1/10有重复数字。这说明不一样的0.333…代表了1/3。数字1/8,然而,是准确的,0表示的尾数。
可以解决大多数问题引起的舍入误差避免数字之间的直接比较。例如,如果你有一个平等的测试中,由于舍入错误失败,你应该比较操作数的差异和检查与宽容。而不是:
A = =
试试这个:
abs (A - b) < 1 e-12 *的(大小(A))
此外,当你运行任何数学软件,包括软件MATLAB,各种计算。这些计算都是通过调用底层数学库*,+,^,更不用说罪恶,因为,sqrt。数学库是提供系统的编译器,因此系统的依赖。因此,你可以得到不同的答案在惠普比太阳做乘法,但是你可能注意到,因为它只会改变一个数字,如果任何。然而,在做一系列的计算这些差异加起来,然后你会发现不同之处。如上所述,这些差异是由于底层数学库、编译器、建筑和它们是如何实现的。
如果你需要比MATLAB的标准双精度运算提供了更精确,您可以使用符号数学工具箱进行计算象征性地无限精确算法。然而,符号计算将低于标准的双精度运算,而不是所有功能将接受符号对象。符号数学工具箱的更多信息,请参阅:
在解决这些类型的问题的更多信息,见一节“避免与浮点算术常见问题”以下文档页面:
如果您有兴趣更多的信息在MATLAB的双精度运算,克里夫的角落有个绝佳的文章,讨论这些问题。查看1996年秋季MATLAB新闻和笔记,发现:
1评论
1月
1月 2017年12月8日
abs (A - b) < 1 e-12 *的(大小(A))
可以简化为:
abs (a - b) < 1 e-12
但这可能不是足够如果A和B的大小如1 e - 200。好:
abs ((:) - B (:)) < 100 * eps (max (abs ((:)), abs (B (:))))
选择100 * eps的极限 神奇的 在这里。一个足够的价值取决于这个问题。也许只有的值应该考虑,如果这个包含“参考价值”:
abs ((:) - B (:)) < 100 * eps (abs ((:)))

登录置评。

更多的答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!