罗兰的MATLAB艺术

将想法转化为MATLAB

瞥见浮点精度

有频繁的帖子MATLAB新闻组以及许多关于MATLAB浮点准确性的技术支持的问题。金宝app当一些看似简单的算术没有给出直观的答案时,许多人认为他们发现了一个错误。出现的问题与计算设备用于存储和操作的有限比特有关的问题。

内容

计算器演示

你是否曾不耐烦地等电梯,然后继续推电梯向上按下按钮,希望电梯能更快到达?如果是这样,你可能已经不耐烦地重复按计算器上的按钮(假设你知道计算器是什么!)不仅仅是MATLAB有时会以一种似乎违背我们预期的方式计算值。

清除格式

这是我尝试的方法。我把7放进计算器里。我认为它是单精度计算,但我不确定。当我开平方根的时候,小数点后有7位,这样做几次,我得到

sqrts7inSingle = single([7 2.6457513 1.6265765 1.275373])
sqrts7inSingle = 7.0000000 2.6457512 1.6265765 1.2753730

接下来,我把最后的数平方3次,结果是

squaresqrt7insingle = single([1.275373 1.6265762 2.6457501 6.99999935])
SquaringsQrt7 insingle = 1.2753730 1.6265762 2.6457500 6.9999995

比较原始值和最终值之间的差异。

Sqrts7 insingle(1)-squaringsqrt7 insingle(结束)
ans = 4.7683716 e - 007

这个数字在这种情况下非常有趣。将它与一个精度值7与下一个最接近的值之间的距离进行比较,也称为浮点相对精度

EPS(单(7))
ans = 4.7683716 e - 007

我们得到相同的价值!因此,我们可以展示有限存储大小对手持式计算器的值的影响。让我们现在尝试同等的Matlab。

MATLAB的准确性

让我们使用单精度在Matlab中进行类似的实验,因此当我使用计算器时,我们对其中的情况具有类似的情况。在这种情况下,我将继续服用平方根,直到价值达到1。

num =单(7);数= 0;托尔=每股收益('单身的');dnum = sqrt(num);Abs (dnum-1)>=tol count = count+1;dnum =√dnum);结束
count = 23.

所以,在我们达到第1号之前,它需要23个迭代。但现在我们处于有趣的情况。没有办法放大1,并达到了7的原始值。

使用双精度

让我们使用双精度从MATLAB中的计算器重复相同的实验。

num = 7;sqrtd = sqrt(num);SQRTD(2)= SQRT(SQRTD(1));SQRTD(3)= SQRT(SQRTD(2))PROSS(1)= SQRTD(END);刺激(2)=刺(1)^ 2;Prods(3)= Prods(2)^ 2 Finalnnum = Prods(3)^ 2
sqrtd = 2.64575131106459 1.62657656169779 1.27537310685845 prods = 1.27537310685845 1.62657656169779 2.64575131106459 finalNum = 7.00000000000001

找到差异finalNum并与适当的相对浮点精度进行比较:

Diffnum = Finalnnum-Num Acc = EPS(NUM)* 6 Diffnum-ACC
DIFFNUM = 5.329070518200751C-015 ACC = 5.329070518200751C-015 ANS = 0

我计算时为什么使用6acc?因为我执行了6个浮点运算来得到最终的答案,3√6应用,然后是答案的平方3次。

典型的matlab pitfall.

我跑过的最常见的matlab pitfall是当用户检查从中生成的值的平等操作员.代码足够无辜地开始。我实际上在这里旋转了一下逻辑,所以我们将在循环中打印出循环计数器可能不是用户所期望的东西的值。

格式短的IND = 0:.1:1;如果Ind ~= fix(10* Ind)/10 disp(Ind - fix(10* Ind)/10)结束结束
5.5511 e - 017 1.1102 1.1102 e - 016 e - 016

然后这个问题是,为什么要这么做任何输出的值的多少?这是因为计算机不能准确地表示所有的数字,给定一个固定的存储大小,比如双精度。

结论

这是关于浮点的一个非常简化的解释,但我希望,这很容易理解。让我知道。

参考

这里有一些指向更多资源的指针。


与MATLAB®7.2发布

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击这里要登录您的MathWorks帐户或创建新的。