什么算法用于c中的pow()函数

Mos*_*man -1 c floating-point

#include<stdio.h>
#include<math.h>

int main() {
double n,p,ans;
while(scanf("%lf %lf",&n,&p)==2)
{
    ans=pow(p,(1/n));

    printf("%.0lf\n",ans);
}
return 0; 
 }
Run Code Online (Sandbox Code Playgroud)

这里用什么算法来查找ans.这个pow()函数的复杂性是什么?

小智 6

C99标准的4.12.7.4节中没有更多关于pow功能的说法,而不是以下内容:

新思

#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
Run Code Online (Sandbox Code Playgroud)

描述

pow函数计算xy.如果x是有限和负的并且y是有限的而不是整数值,则会发生域错误.可能会出现范围错误.如果x为零且为零,y则可能发生域错误.如果x为零且y小于零,则可能发生域错误或范围错误.

返回

pow函数返回[ xy.

注意,没有给出关于函数复杂性的信息,并且没有关于要使用的算法的期望.这是因为在C的一些实现中,函数可以是处理器的原生函数,而在其他体系结构上,硬件不提供浮点处理.

但是,您可以假设复杂性并不比log乘法和exp组合的复杂性差:

double pow(double x, double y) {
    return exp(log(x)*y);
}
Run Code Online (Sandbox Code Playgroud)

在FP单元的许多平台上,base-e取幂,浮点乘法和自然对数都需要O(1)时间,因此也pow应如此.

-edit2-我不那么肯定了对复杂的explog,但我觉得实现使用泰勒近似和一堆查找表.那仍然会给O(1).

  • FP乘法在许多具有FP单元的架构上应该是"O(1)".在这些情况下,乘法在硬件中实现并且需要恒定的周期数.请记住,这不是*精确*整数计算,而是*近似*浮点计算. (2认同)