Matlab中双精度的算术精度

时间:2010-09-13 00:17:43

标签: matlab floating-point double precision

我在理解这些双精度的精度如何影响Matlab中算术运算的结果时遇到了一些麻烦。我认为既然是& b是双打,他们能够执行高达该精确度的操作。我意识到可能存在舍入错误,但由于这些数字完全在64位数字表示内,我认为这不会是一个问题。

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

为什么它能够携带足够的精度来识别!= 0但是当它被添加到1时它没有显示任何变化。

3 个答案:

答案 0 :(得分:6)

64位IEEE-754浮点数具有足够的精度(具有53位尾数)以表示大约16个有效十进制数字。但它需要更多像45个有效十进制数字 为你的例子说出(1 + a)= 1.00 .... 000122和1.000之间的区别。

答案 1 :(得分:6)

“浮动”点意味着 - 精度相对于数字本身的比例。

在你给出的具体例子中,1.22e-45可以单独表示,因为指数可以调整为10 ^ -45,或大约2 ^ -150。

另一方面,1.0以二进制表示,刻度为2 ^ 0(即1)。

要添加这两个值,您需要对齐它们的小数点(呃......二进制点),这意味着1.22e-45的所有精度都向右移动了150多位。

当然,IEEE双精度浮点值只有53位尾数(精度),这意味着在1.0的范围内,1.22e-45实际上为零。

答案 2 :(得分: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!