Floating point dot产品的最差精度是多少?

Floating point dot产品的最差精度是多少?,floating-point,floating-accuracy,ieee-754,Floating Point,Floating Accuracy,Ieee 754,假设处理器只有符合IEEE-754的“fadd”和“fmul”操作(没有“dot”或“fma”指令)。点积运算的简单实现将实现的最坏情况下的精度是多少。例如,对于长度为3的向量: dot(vec_a, vec_b) = vec_a.x*vec_b.x + vec_a.y*vec_b.y + vec_a.z*vec_b.z 以下是我的分析,但我不确定它是否正确: 对于长度为N的向量,有N次乘法和N-1次加法,导致2N-1次浮点运算。在最坏的情况下,对于这些操作中的每一个,表示都太小,无法得到准确

假设处理器只有符合IEEE-754的“fadd”和“fmul”操作(没有“dot”或“fma”指令)。点积运算的简单实现将实现的最坏情况下的精度是多少。例如,对于长度为3的向量:

dot(vec_a, vec_b) = vec_a.x*vec_b.x + vec_a.y*vec_b.y + vec_a.z*vec_b.z
以下是我的分析,但我不确定它是否正确:
对于长度为N的向量,有N次乘法和N-1次加法,导致2N-1次浮点运算。在最坏的情况下,对于这些操作中的每一个,表示都太小,无法得到准确的结果,因此中间结果将被四舍五入。每四舍五入加起来等于0.5 ULP误差。因此,最大误差将是(2N-1)*0.5=N-1/2 ULP?

您的推理不适用于加法:如果
a
b
已经不准确了0.5 ULP,并且
a
接近
-b
,那么
a+b
的相对准确度可能比1.5 ULP差得多。事实上,如果没有关于计算点积的向量的更多信息,就无法保证结果的相对准确性

当只有乘法时,你的推理路线是正确的,但它忽略了复合错误

考虑以下等式:(a+ea)(b+eb)=ab+aeb+bea+eaeb

如果假设a和b都在1和2之间,则两个结果相乘后的总相对误差(已经精确到0.5 ULP)在粗略的一次近似中只能估计为1 ULP,并且仍然忽略误差项eaeb和相乘本身的误差。浮点乘法结果的总相对误差约为1.5 ULP,这只是一个粗略的平均值,不是一个合理的最大值

这些已经形式化并证明了双精度浮点点积精度的概念。将其结果翻译成英语是,如果每个向量分量都以
1.0
为界,则点积的最终结果精确到NMAX*B,其中NMAX是向量的维数,B是一个常数,取决于NMAX。链接页面上提供了一些值:

NMAX 10 100 1000 B 0x1.1p-50 0x1.02p-47 0x1.004p-44
与许多FP误差分析一样,误差强烈依赖于输入的最大幅度。在这种情况下,一个粗略且准备就绪的误差范围是
2*FLT\u EPS*dot(abs(vec\u a),abs(vec\u b))
,其中
abs
表示向量的元素绝对值。

感谢您指出我的错误假设。描述最坏情况错误的好方法是什么?可能与vec_a和vec_b?@zr中的最大元素有关。关于向量,你能说些什么吗?例如,一个向量的每个分量总是与另一个向量的相应分量具有相同的符号(例如,如果所有被操纵向量的所有分量都是正的,这就意味着这一点)?如果没有任何附加信息,我认为很难将点积这种复杂操作的总误差描述为单个相对误差统计或绝对误差统计。@PC输入值没有限制。是否至少有一些上限可用于健全性测试?编辑:我会看报纸的,谢谢!数值分析中用于点积的通常误差界是向后误差界,它涉及向量的范数(这比Sneftel引用的更精确的界宽松,或者Pascal在这里给出的更精确的界,但对于大多数数学目的来说完全足够).相对误差可以任意大,但绝对误差将以早期计算中存在的最大绝对误差之和为界。如果预期结果介于-100和+100之间,并且需要精确到+/-0.1个单位,并且如果最坏情况下的绝对误差总和为0.037,则采用简单的方法即可。如果结果为0.0001274,相对误差可能很大,但如果所有-0.05和+0.05之间的结果都被认为是等效的,那就没关系了。你能解释一下为什么上面的表达式是上限吗?详细的证据可以在Nicholas Higham的《数值算法的准确性和稳定性》中找到。简单地说,点积是三个FP运算的“深”,它涉及的加法的大小等于绝对点积的大小。(注意:这意味着常数因子可以从2收紧到略大于1.5。不过,我倾向于对FP误差界常数因子进行四舍五入,以确保边界计算本身不会受到有问题的四舍五入的影响。)在求和之前,您是在对乘积向量进行排序,例如使用Kahan求和,还是直接求和?如何求和会影响该步骤中的最坏情况错误。乘积是按元素顺序任意计算的。不能为了精度而牺牲运行时间
@ loop invariant \abs(exact_scalar_product(x,y,i)) <= i * P * P;
@ loop invariant \abs(p - exact_scalar_product(x,y,i)) <= i * B * P * P;