Floating point 数值稳定性-乘/除是否比除/乘给出更精确的值?

Floating point 数值稳定性-乘/除是否比除/乘给出更精确的值?,floating-point,precision,floating-accuracy,numerical-stability,Floating Point,Precision,Floating Accuracy,Numerical Stability,考虑以下代码: $result*=$oldFactor/$newFactor//使用速记*=运算符 实际上是这样的: $result=$oldFactor/$newFactor*$result//先除名 我也可以这样手动编写: $result=$result*$oldFactor/$newFactor//先做乘法 我的印象是乘法是一种更简单的运算,与除法运算相比,乘法不会受到舍入误差的影响 此外,我有一种感觉,对于大多数日常的人类数字,乘法运算会在除法之前产生一个“较大的数字”(假设使用的

考虑以下代码:

$result*=$oldFactor/$newFactor//使用速记*=运算符
实际上是这样的:

$result=$oldFactor/$newFactor*$result//先除名
我也可以这样手动编写:

$result=$result*$oldFactor/$newFactor//先做乘法
我的印象是乘法是一种更简单的运算,与除法运算相比,乘法不会受到舍入误差的影响

此外,我有一种感觉,对于大多数日常的人类数字,乘法运算会在除法之前产生一个“较大的数字”(假设使用的数字通常大于1)。而且被除数越大,数值越稳定。例子。。考虑<代码> 5×7 / 2.3 第一操作(MULT)是精确的,因为这些数字用二进制表示。然后除法就完成了,我们将得到的结果是最精确的。但是考虑<代码> 7/2.3×5 <代码>,其中第一个操作被分割,并且我们已经产生了一个不能用二进制精确表示的数字,并且下一个操作(MUT)通过乘法来夸大任何不精确性。
我的问题基本上是。。。这有关系吗?首先使用除法时,我是否确实会失去精度,或者我是否完全安全地使用最适合我的运算顺序,并且我将得到相同的结果?

这取决于数字;没有普遍的规则。例如,在一个尾数为1的机器上考虑<代码> 7×4/2 <代码>。如果先乘,则取
7*4=28
,这四舍五入为
30
。然后您有
30/2=15
,它将循环到
20
。另一方面,如果你先除法,你得到的是
7*(4/2)=7*2=14
,它会四舍五入到
10
,因此在这种情况下,先除法会得到更准确的结果。你必须平衡乘法后的舍入和除法后的舍入。