我在理解这些双精度的精度如何影响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时它没有显示任何变化。
答案 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!