我有一个关于计算精度的问题 - 它更像是编程背后的数学理论。
我有一个给定的浮点数X
以及该数字的四舍五入,精确到10^(-n)
小数位:X'
。现在,我想知道,如果在计算指数函数后:y=2^(x)
,我的数字和舍入数字之间的差异将保持在相同的精度水平。我的意思是:
|2^(X)-2^(X')|
处于10^(-n-1)
答案 0 :(得分:2)
指数放大相对误差,并且通过扩展,放大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 +ε),那么e x = e n *(1 +ε) = e n * e n *ε≈e n *(1 + n *ε)。因此,如果n≈128,ε≈1e-7,则预期的最大相对误差约为1.28e-5。