指数函数后的计算精度



我有一个关于计算精度的问题——这更多的是编程背后的数学理论。

我有一个给定的浮点数X和该数字的四舍五入,精确到10^(-n)的小数点:X'。现在,我想知道,在计算指数函数:y=2^(x)之后,我的数字和四舍五入的数字之间的差是否会保持在相同的精度水平上。我的意思是:

|2^(X)-2^(X')|处于10^(-n-1)的水平

指数放大相对误差,进而放大ulp误差。考虑这个示例:

float x = 0x1.fffffep6;
printf ("x=%a %15.8e  exp2(x)=%a %15.8en", x, x, exp2f (x), exp2f(x));
x = nextafterf (x, 0.0f);
printf ("x=%a %15.8e  exp2(x)=%a %15.8en", x, x, exp2f (x), exp2f(x));

这将打印类似的内容

x=0x1.fffffep+6 1.27999992e+02  exp2(x)=0x1.ffff4ep+127 3.40280562e+38
x=0x1.fffffcp+6 1.27999985e+02  exp2(x)=0x1.fffe9ep+127 3.40278777e+38

结果中的最大ulp误差将与所使用的浮动格式的2指数位在相同的数量级上。在这个特定的例子中,在IEEE-754float中有8个指数位,并且输入中的1 ulp差转化为结果中的176 ulp差。自变量的相对差异约为5.5e-8,而结果的相对差异为5.3e-6。

关于这种放大倍数的一种简化、直观的思考方式是,在浮点自变量的有效位/尾数中的有限数量的比特中,有些比特只对结果的大小有贡献,因此是指数比特(在本例中,这些比特表示127的整数部分),而剩余的比特对结果的有效位/尾数比特有贡献。

如果你从数学上看,如果原始自变量x=n*(1+ε),那么ex=en*(1+1ε)=en*e>n*ε≈e2*(1+n*ε)。因此,如果n≈128,ε≈1e-7,则预期的最大相对误差约为1.28e-5。

最新更新