浮点产品扩展等价

时间:2014-02-10 12:14:27

标签: c++ floating-point

在IEEE 754浮点中,有可能

a*(b-c) != a*b-a*c // a, b, c double

因此,产品的扩展不能保证等于未扩展的产品。

但是这个怎么样:

a*(b1+b2+...+bn) == a*b1+a*b2+...+a*bn // b1==b2==...==bn

当所有b相等时,是否保证等效(如果没有欠/溢)?如果在编译时知道b的相等性是否存在差异?

修改

不是 - 请参阅Eric Postpischil和Pascal Cuoq。

但是可能会持有较弱的断言?:

   (1.0/n)*(b1+b2+...+bn) <= 1.0
&& (1.0/n)*b1+(1.0/n)*b2+...+(1.0/n)*bn <= 1.0

// when all b<=1.0 and n integral double but not power of 2
// so that 1.0/n not exactly representable with base-2 floating point

我只是想知道您是否可以保证数据集的平均值不超过每个数据值也未超过的某个值无论如何计算平均值(首先添加和一次分割,或者添加每个分割的值)。

EDIT2:

好的,&&不成立。见Eric Postpischil和David Hammen:

average of nine 1.0 -> only first condition is true, second exceeds.
average of ten 1.0/3 -> only second condition is true, first exceeds.

那么最优计算平均值依赖于数据集的上限预期极限的方法是什么?或者也是数据集的大小(表示n)?或者没有最佳方法肯定存在吗?

3 个答案:

答案 0 :(得分:3)

IEEE 754没有深入研究语言细节。特别是,未指定“编译时间”等详细信息。对于某些语言来说,这甚至都没有意义。

最简单的理解是你有一个中间无穷大。假设sum(b)==INF,勉强,但a为0.5。结果a*sum(b)仍然是INF。但是,通过先乘以后续添加不再溢出。

答案 1 :(得分:3)

即使不包括溢出和下溢,结果也可能不同。

.3 * (.3+.3+.3)0.269999999999999962252417162744677625596523284912109375 .3*.3 + .3*.3 + .3*.30.270000000000000017763568394002504646778106689453125(当使用IEEE-754规则和64位二进制浮点进行评估时)。

关于更新中添加的问题:

有两个问题,其中一个问题是,一组数字的计算平均值是否均不超过1。如David Hammon points out,将9个1的平均值计算为1./9*1 + 1./9*1 + 1./9*1 + 1./9*1 + 1./9*1 + 1./9*1 + 1./9*1 + 1./9*1 + 1./9*1会产生1.0000000000000002220446049250313080847263336181640625。

另一个询问集合的计算平均值是否可以超过集合中的所有数字。这是第一个问题的超集,但这里是一个使用不同的平均值计算的例子:

设b = 1./3(即0.333333333333333314829616256247390992939472198486328125)。

然后1./10 * (b+b+b+b+b+b+b+b+b+b)是0.33333333333333337034076748750521801412105560302734375,大于b

答案 2 :(得分:2)

  

但是可能会持有较弱的断言?:

(1.0/n)*(b1+b2+...+bn) <= 1.0
&& (1.0/n)*b1+(1.0/n)*b2+...+(1.0/n)*bn <= 1.0

没有。例如,这个断言在我的计算机上失败,n = 9且b i = 1.0

  

我只是想知道你是否可以保证数据集的平均值不会超过每个数据值都不会超过的某个值,无论你如何计算平均值(首先添加和一次分割,或者每次添加价值分割)。

再一次,答案是否定的。两个随机变量之间的相关E [(X-Xbar)*(Y-Ybar)] /(sigma_x * sigma_y)应始终在-1.0和1.0之间。然而,如果计算两个完全相关(或完全反相关)随机变量的统计数据,您通常会看到略大于+1(或略小于-1)的相关性。