pow(x,y)
计算为e^(y*log(x))
通常数学库log(x)
以四精度计算(这很耗时),以避免在计算时精度损失,y*log(x)
因为精度误差会在计算中放大e^(y*log(x))
。现在,如果我想pow(x,y)
在以下步骤中进行计算。
double pow(double x,double y) {
return exp(y*log(x)); // Without any quad precision multiplication
}
此函数的最大 ULP 错误是多少。我知道 IEEE-754 标准规定任何浮点运算的 ULP 误差应小于 0.5,即0.5*2^(-52)
. 因此,如果我的操作y*log(x)
出现 0.5 ULP 错误,我如何计算最大可能的 ULP 错误e^(y*log(x))
同意计算pow(x,y)
相当复杂。算法通常log(x)
以更高的精度计算,并且两者之间的乘法y
并不log(x)
简单。由于 ULP 误差取决于y*log(x)
,因此最大误差将针对 的最大值Y*log(x)
不是e^(y*log(x))
无穷大。正确的?对于这种情况,我如何计算 ULP 的数量?双精度格式的尾数的最大位数是多少,在最大值的情况下会与实际值不同y*log(x)
?
更新了问题。感谢所有的帮助!
那么 10 位差异会导致多少 ULP 错误?我计算为,
ULP = (actual - computed)/ 2^(e-(p-1))
其中 e 是实际数字的指数,p=53 表示双精度。我读到我 ULP = 2^(e-(p-1)) 假设,
Actual = 1.79282279439444787915898270592 *10^308
Computed = 1.79282279439451553814547593293 * 10^308
error= actual - computed = 6.7659e+294
现在
1 ULP = 2^(e- (p-1))
e = 1023 (exponent of the actual number - bias)
1 ULP = 2^(1023 - (53-1)) = 2^971
ULP error = error/ 1 ULP = 339
这个对吗?