3 回答
TA贡献1856条经验 获得超11个赞
通常pow(double, double),数学库中函数的实现基于身份:
pow(x,y) = pow(a, y * log_a(x))
使用此标识,您只需要知道如何将单个数字a升为任意指数,以及如何采用对数底数即可a。您已经有效地将一个复杂的多变量函数转换为一个变量和一个乘法的两个函数,这很容易实现。最常见的选择值a是e或2- e因为e^x和log_e(1+x)有一些非常漂亮的数学特性,并且2因为它具有用于浮点运算执行一些不错的性能。
做这种方式的缺点是,(如果你想获得完全精确),你需要计算的log_a(x)项(以及它与产品y)比的浮点表示更高的精度x和y。例如,如果x和y是双精度数,并且想要获得高精度结果,则需要想出一些方法以更高精度的格式存储中间结果(并进行算术运算)。Intel x87格式和64位整数一样是常见的选择(尽管如果您确实想要高质量的实现,则需要执行一些96位整数计算,这在某些情况下会有些痛苦语言)。如果实施powf(float,float),则处理起来要容易得多,因为那样就可以使用double用于中间计算。如果您要使用这种方法,我建议从此开始。
我概述的算法不是唯一可行的计算方法pow。它只是最适合提供满足固定先验精度范围的高速结果。它在某些其他情况下不太合适,并且比其他一些人建议的重复平方根算法肯定更难实现。
如果要尝试使用重复平方[root]算法,请首先编写一个仅使用重复平方的无符号整数幂函数。一旦掌握了这种简化情况的算法,您就会发现将其扩展为处理分数指数非常简单。
- 3 回答
- 0 关注
- 771 浏览
添加回答
举报