Floating point 浮点乘法与多重加法的比较

Floating point 浮点乘法与多重加法的比较,floating-point,numerical-analysis,Floating Point,Numerical Analysis,让我们假设a是一个以2为基数(二进制)的标准化浮点数。下列等式正确吗 fl(a+a+a)=fl(3*a)记法和前提 a表示一个数学数字a表示浮点值。3a表示数学表达式(使用实数算术)a+a+a和3*a表示使用浮点运算的表达式 典型浮点系统中算术的一个基本特征是,浮点运算的结果被定义为在某个方向上四舍五入到最接近的可表示值的数学结果(通常在最接近的可表示值方向上,与具有偶数低位的可表示值相关,但也可选择其他方向)。1 有限,正常值 在二进制浮点运算中,如果a是可表示的且2a在有限范围内,则2a是可

让我们假设a是一个以2为基数(二进制)的标准化浮点数。下列等式正确吗

fl(a+a+a)=fl(3*a)

记法和前提 a表示一个数学数字
a
表示浮点值。3a表示数学表达式(使用实数算术)
a+a+a
3*a
表示使用浮点运算的表达式


典型浮点系统中算术的一个基本特征是,浮点运算的结果被定义为在某个方向上四舍五入到最接近的可表示值的数学结果(通常在最接近的可表示值方向上,与具有偶数低位的可表示值相关,但也可选择其他方向)。1

有限,正常值 在二进制浮点运算中,如果a是可表示的且2a在有限范围内,则2a是可表示的,因为它们表示的唯一区别在于指数。因此,给定表示数字a的浮点数
a
,则
a+a
的结果正好是2a。然后
a+a+a
(即
(a+a)+a
)是数学结果3a(因为数学结果是2a+a)四舍五入到最接近的表示值。
3*a
的浮点结果也是四舍五入到最接近的表示值的数学结果3a。因此
a+a
3*a
具有相同的浮点结果,等式成立

特例 仍然要考虑特殊情况。

如果表示a的
a
是有限的,但2a超出了浮点结果为有限的范围,则
a+a
产生无穷大,
a+a
产生相同的无穷大,
3*a
,因此等式成立

如果
a
是一个无穷大,则
a+a
a+a+a
3*a
产生相同的无穷大,且等式成立

如果
a
是NaN,那么
a+a+a
3*a
都是NaN,它们的比较并不相等,因为两个NaN从来都不是值相等的数字

脚注
1问题没有指定所使用的浮点系统。当然可以定义一个浮点系统,其中
1+1
产生
0
0+1
产生
0
,而
3*1
产生
5
。然而,为了这个答案,我们假设一个典型的浮点系统。

您没有指定格式,IEEE 754很流行,但不是唯一的野兽

作为一般规则,不要使用与浮点相等,因为浮点二进制格式与无限精确的数字不同。假设在一个情况下,一边有两个操作,另一边有一个操作,每个操作都可以剪裁,因此每个操作的精度损失应该是预期的,两个操作可能会丢失/更改ge不止一个操作。舍入如果部分格式和实现可以帮助在特定情况下弥补某些损失,但这不是一个完整的修复方法,有时会造成伤害

因此,一般情况下,不要假设这会起作用,但在这种特定情况下,让我们从IEEE风格的格式1.fraction开始,我们不需要太多尾数来了解它是如何起作用的

1.abc(a、b、c为单位)

正如Eric指出的,从2*a开始

  1abc
+ 1abc
========
 1xxx0
无论c是1还是0,lsbit都是0。固定点1abc+1abc=2*1abc,只要我们不溢出指数:

  1abc
+ 1abc
========
 1abc0
如果愿意,您可以遍历尾数位的组合和数量

加上a+a+a就到了这一点

 1abc0
+ 1abc
=======
   1abc
+ 1abc0
========
对于乘法情况

    1abc
    1100
  ====== 
    0000
   0000
  1abc
+1abc
===========
到了这一点

 1abc0
+ 1abc
=======
   1abc
+ 1abc0
========
所以他们在同一个地方结束,他们是平等的,是吗

舍入在这里不是一个因素,因为较低的位通过任一路径产生相同的值…是吗

例如,IEEE中的负数也使用正数1.f格式,符号单独处理。在这种情况下,乘法路径p*p为正数,p*n为负数,因此两条路径都有效,因此保留符号(此处3始终为正数)。对于加法路径,结果要么变为负值,要么变为正值,它们保留其符号

第一次加法可能导致指数溢出,这可能导致IEEE中的NAN。例如,第二次加法,同样的故事。乘法也可能导致NAN,最好假设通过两条路径,两个NAN结果不是二进制相等的,因此比较不起作用。如果我记对了,一个是信令和另一个安静的是吗

其他格式。仍在使用的格式应该和1.f类型的格式一样容易演示。例如,正01.fraction,负10.fraction

这里的关键是乘法的实现应该支持所需的2n个位数(对于定点n位*n位=2n位,将覆盖所有情况,32位位数乘以32位位数需要64位来存储它)倾向于在值的顶部强制1的格式意味着您将从小学开始乘以1xxx…*1xxx

a.bcd
e.fgh
======
我们将以定点abcd*efgh的形式进行计算,然后自动将结果中的小数点移到6上。然后,二进制浮点将需要标准化,并根据格式将最重要的1或0移到二进制点的左侧,调整指数,类似于我们在scientific notat中使用10的幂理想情况下,逻辑将使用足够的位使定点数学计算正确,然后将其规格化,然后进行剪裁,可能进行取整

所以在一天结束时,你会看到

     abcd
    abcd
   abcd
  abcd
+ ...
对于3*a和a+a+a的情况

最好的情况是把c当作一根棍子
    0000
   0000
  1abc
+1abc
===========
 xxxxxxx`
    0 
   00 
  1ab 
+1abc
===========
 xxxx`