指数函数后的计算精度
Precision of calculations after exponent function
我有一个关于计算精度的问题 - 它更像是编程背后的数学理论。
我有一个给定的浮点数 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.8e\n", x, x, exp2f (x), exp2f(x));
x = nextafterf (x, 0.0f);
printf ("x=%a %15.8e exp2(x)=%a %15.8e\n", 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-754 float
中有 8 个指数位,输入中的 1 ulp 差异转化为结果中的 176 ulp 差异。参数的相对差异约为 5.5e-8,而结果的相对差异约为 5.3e-6。
关于这种放大的一种简化、直观的思考方式是,在浮点参数的有效数/尾数的有限位数中,一些只对幅度有贡献,因此指数位,结果(在示例中,这些位将代表 127 的整数部分),而其余位构成结果的有效位/尾数位。
如果从数学上看,如果原论证x = n*(1+ε),那么ex = en*(1 +ε) = en * en*ε ≈ en * (1+n*ε)。因此,如果 n ≈ 128,ε ≈ 1e-7,则预期的最大相对误差约为 1.28e-5。
我有一个关于计算精度的问题 - 它更像是编程背后的数学理论。
我有一个给定的浮点数 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.8e\n", x, x, exp2f (x), exp2f(x));
x = nextafterf (x, 0.0f);
printf ("x=%a %15.8e exp2(x)=%a %15.8e\n", 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-754 float
中有 8 个指数位,输入中的 1 ulp 差异转化为结果中的 176 ulp 差异。参数的相对差异约为 5.5e-8,而结果的相对差异约为 5.3e-6。
关于这种放大的一种简化、直观的思考方式是,在浮点参数的有效数/尾数的有限位数中,一些只对幅度有贡献,因此指数位,结果(在示例中,这些位将代表 127 的整数部分),而其余位构成结果的有效位/尾数位。
如果从数学上看,如果原论证x = n*(1+ε),那么ex = en*(1 +ε) = en * en*ε ≈ en * (1+n*ε)。因此,如果 n ≈ 128,ε ≈ 1e-7,则预期的最大相对误差约为 1.28e-5。