猿问

我如何自己编写幂函数?

我一直想知道如何创建一个自己计算功效的函数(例如2 3)。在大多数语言中,这些都包含在标准库中,大部分是pow(double x, double y),但是我该如何自己编写呢?


我当时在想for loops,但它认为我的大脑陷入了循环(当我想使用非整数指数(例如5 4.5或负数2 -21)进行幂运算时,我变得疯狂了;)


那么,我该如何编写一个计算实数幂的函数?谢谢


哦,也许需要注意的重要一点:我不能使用使用幂的函数(例如exp),这最终将使它无用。


幕布斯6054654
浏览 772回答 3
3回答

呼唤远方

通常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]算法,请首先编写一个仅使用重复平方的无符号整数幂函数。一旦掌握了这种简化情况的算法,您就会发现将其扩展为处理分数指数非常简单。
随时随地看视频慕课网APP
我要回答