求幂算法如何工作?

Amr*_*man 2 c algorithm math function exponentiation

大多数现代语言中的指数很容易..我用我选择的语言中的常用运算符或任何补偿它以获得所需功能的函数.
我想知道,这究竟是如何运作的?

C中的以下算法通常用于演示此效果.

double exp(val, pow) {
    for(int i = 0; i < pow; ++i)
        val *= val;
    return val;
} // exp(2, 3) -> 8
Run Code Online (Sandbox Code Playgroud)

然而,这里有一个严重的错误..如果pow是2.6怎么办?那也会返回8 ..
那只是因为循环条件只比较两个数字..
但是当我做这样的事情时,它运作良好..

#include <math.h>
int main() {
    printf("The result of 2 to the power of 2.6 is %.2f", pow(2, 2.6));
}
Run Code Online (Sandbox Code Playgroud)

如何实现后一种行为?

编辑:

根据答案,似乎泰勒扩展算法是取幂的关键,那么......乘法呢?如何实现十进制乘法?

Cha*_*les 8

指数化通常被实现为(许多特殊情况加上)减少到exp.如果你有一个exp函数及其反函数ln,你可以计算x ^ y as

exp(y*ln(x))
Run Code Online (Sandbox Code Playgroud)

但您可能想知道如何exp实施.对于小参数,系列扩展效果很好:

exp(x)= 1 + x + x ^ 2/2 + x ^ 3/6 + x ^ 4/24 + ......

编辑:这是其他答案中提到的泰勒扩展.

对于较大的值,可以使用参数减少技术来计算该值.

  • AFAIK,`exp`(以及其他一些超越函数)通常使用[chebyshev多项式](http://en.wikipedia.org/wiki/Chebyshev_polynomials)计算,而不是泰勒计算.顺便说一句,一些编译器将`exp`(在x86-64上)转换为计算它的硬件指令. (5认同)