Floating point 指数函数后的计算精度

Floating point 指数函数后的计算精度,floating-point,precision,numerical-methods,Floating Point,Precision,Numerical Methods,我有一个关于计算精度的问题——这更多的是编程背后的数学理论 我有一个给定的浮点数X和该数的四舍五入,精确到10^(-n)小数位:X'。现在,我想知道,如果在计算指数函数:y=2^(x)之后,我的数字和取整后的数字之间的差值将保持在相同的精度水平。我的意思是: |2^(X)-2^(X')|处于10^(-n-1)幂运算放大了相对误差,进而放大了ulp误差。考虑这个说明性的例子: 这将打印如下内容 x=0x1.fffffep+6 1.27999992e+02 exp2(x)=0x1.ffff4ep

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

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


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

幂运算放大了相对误差,进而放大了ulp误差。考虑这个说明性的例子:

这将打印如下内容

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
浮点值中有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。

这里的礼仪是不在问题上签字(您的名字在右下角)。问候和感谢也应该避免。我不太明白这一点。。。必须计算2^x,而x是一个大数字,在“.”之后有许多数字。我应该将结果四舍五入到尽可能远的数字吗?根据你所写的,这会不会增加结果错误的重要性?我不明白你的问题。我应该做些什么来最小化错误:使用更多或更少的指数位?更高的精度是一个直观的答案,但您已经写道,我使用的指数位越多,我得到的结果中的最大ulp误差就越大。在您添加了带有“n*(1+ε)”的部分后,很明显,数字越精确越好。那么,我在你的回答中对结果中的最大ulp误差有什么误解呢?幂运算中相对误差的放大率是参数大小的函数。指数位数对于任何选定的IEEE-754浮点格式都是固定的,它提供了参数大小的上限,从而提供了放大率。我举了一个最坏的例子来说明这个问题。你没有提供背景,所以我不能推荐一个策略。例如,您可以尝试将输入表示为双浮点数或双浮点数,然后计算exp(head)+tail*exp(head),这在尝试实现
pow(x,y)
时效果很好。
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