2010-09-13 100 views
5

我在理解這些雙精度如何影響Matlab中算術運算的結果時遇到了一些麻煩。我認爲,既然兩個&b都是雙打的,他們將能夠以這種精度進行操作。我意識到可以有四捨五入的錯誤,但由於這些數字在64位數字表示範圍內,我不認爲這會是一個問題。在Matlab中使用雙精度的算術精度

a = 1.22e-45 
b = 1 
a == 0 
    ans = 0 %a is not equal to zero 
(a + b) == 1 
    ans = 1 

爲什麼它能夠承載足夠的精度來識別!= 0,但是當加到1時它不會顯示任何變化。

回答

6

64位IEEE-754浮點數有足夠的精度(用53位尾數)來表示16位重要的十進制數。但它需要更多像45個十進制數字 來區分(1 + a)= 1.00 .... 000122和1.000之間的差異。

+0

我認爲尾數有52位(指數爲11位,加上1位爲64位的符號)。 * Cleve Moler *(第一版MATLAB的作者)的一篇優秀文章解釋了浮點數的所有細節:[PDF鏈接] http://www.mathworks.com/company/newsletters/news_notes/pdf/Fall96Cleve。 pdf – Amro 2010-09-13 01:25:16

+2

@Amro:除非數字是非規格化的,否則有一個隱含的前導「1」位。所以吉姆的權利,在大多數情況下(當然這些數字)。 – 2010-09-13 01:51:42

+0

謝謝。我仍然有辦法理解計算機中的數字表示。 – ZuluForce 2010-09-13 02:00:48

6

「浮點」的意思就是 - 精度與數字本身的尺度有關。

在你給出的具體例子中,1.22e-45可以單獨表示,因爲指數可以調整爲10^-45或者2^-150。

另一方面,1.0以比例2^0(即1)的二進制表示。

要添加這兩個值,您需要對齊它們的小數點(er ...二進制點),這意味着1.22e-45的所有精度都會右移150位。

當然,IEEE雙精度浮點值只有53位尾數(精度),這意味着在1.0的標度下,1.22e-45實際上爲零。

+0

非常感謝你! – ZuluForce 2010-09-13 01:59:37

3

要添加到其他答案所說的內容中,您可以使用MATLAB函數EPS來查看您正在運行的精度問題。對於給定的雙精度浮點數,功能EPS會告訴你離它的距離下一個最大可表示浮點數:

>> a = 1.22e-45; 
>> b = 1; 
>> eps(b) 

ans = 

    2.2204e-016 

請注意,這是大於1的下一個浮點數1.00000000000000022204 ...,並且a的值甚至不接近這兩個數字之間距離的一半。因此a+b最終停留1

順便說一句,你還可以看到爲什麼a被認爲是非零,即使它是如此之小,使用功能REALMIN看錶示的最小雙精度浮點值:

>> realmin 

ans = 

    2.2251e-308 %# MUCH smaller than a!