c++ - 浮点乘积扩展等价

标签 c++ floating-point

在 IEEE 754 float 中,有可能

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

我只是想知道您是否可以保证数据集的平均值不超过某个值每个数据值也不超过,无论您如何计算平均值(先相加再相除,或者相加每个相除的值)。

编辑2:

好的,&& 不成立。参见 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 * (.3+.3+.3)0.269999999999999962252417162744677625596523284912109375.3*.3 + .3*.3 + .3*.30.270000000000000017763568394002504646778106689453125(当两者都使用 IEEE-754 规则和 64 位二进制 float 计算时-点)。

关于更新中添加的问题:

有两个问题,其中一个问题是一组不超过 1 的数字的计算平均值是否可以超过 1。作为David Hammon points out , 计算九个 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.

关于c++ - 浮点乘积扩展等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676955/

相关文章:

c++ - 我想在 qt 中单击(向左或向右)小部件时显示一条消息

c# - 有符号与无符号整数的长度/计数

mysql - 8 位小数的纬度/经度应该使用哪种 MySQL 数据类型?

c++ - 在接受+0.0或-0.0的同时,比较 double 和精确值0的最快方法

java - IBM-IEEE double 浮点字节转换

r - 简单的算术导致 R 中的浮点差异

c++ - vector 的数据如何对齐?

java - 编程中实例的含义是什么?

c++ - SOIL - 获取图像尺寸

java - 什么会导致 float 在没有算术变化的情况下突然偏离 1 位