Matlab中双精度的算术精度

Zul*_*rce 5 floating-point precision double matlab

我在理解这些双精度的精度如何影响Matlab中算术运算的结果时遇到了一些麻烦.我认为既然a和b都是双倍的,他们就可以进行高达那么精确的操作.我意识到可能存在舍入错误,但由于这些数字完全在64位数字表示内,所以我认为这不是问题.

a = 1.22e-45
b = 1
a == 0
   ans = 0  %a is not equal to zero
(a + b) == 1
   ans = 1
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*wis 6

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

  • @Amro:除非数字是非规范化的,否则有一个隐含的前导"1"位.所以吉姆是对的,在大多数情况下(当然还有这些数字). (2认同)

Dre*_*all 6

"浮动"点意味着 - 精度相对于数字本身的比例.

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

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

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

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