计算多项式的值(秦九昭算法,clock()函数的使用)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cp1995921/article/details/78570912
/* clock()函数使用模板

clock():捕捉从程序开始运行到clock()被调用所消耗的时间。这个时间单位是clock tick。
常数CLK_TCK:机器时钟每秒所走的时钟打点数 
clock_t是clock()函数返回的变量类型
duration记录被测函数运行时间,以秒为单位 

#include <stdio.h>
#include <time.h>
clock_t start,stop;
double duration;

int main()
{
   //不在测试范围内的准备工作写在clock()调用之前,例如输入处理之类 
  start=clock();//start存储从main函数开始被调用到clock()被调用所走的ticks 
  Myfunction();
  stop=clock();//stop存储从main函数开始被调用到这个clock()被调用所走的ticks 
  duration=((double)(stop-start))/CLK_TCK;
  //其他不在测试范围内的处理写在后面,例如输出处理之类 
  return 0; 
} 

*/ 

//假设多项式f(x)=0*x^0+1*x^1+2*x^2+...+9*x^9
#include <stdio.h>
#include <time.h>
#include <math.h>
clock_t start,stop;
double duration;
#define MAXN 10//多项式最大项数,即多项式阶数+1 
#define MAXK 1e7//被测函数最大重复调用次数 

//一种比较慢的常规方法 
double f1(int n,double a[],double x)
{
    int i;
    double p=a[0];
    for(i=1;i<=n;i++)
    p+=(a[i]*pow(x,i));
    return p;
}

//秦九韶算法利用乘法结合律从内向外展开 
double f2(int n,double a[],double x)
{
    int i;
    double p=a[n];
    for(i=n;i>0;i--)
     p=a[i-1]+x*p;
    return p;
}
//让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算平均每次运行的时间即可 
int main()
{
    int i;
    double a[MAXN];//存储多项式系数 
    for(int i=0;i<MAXN;i++)
     a[i]=(double)i;

    start=clock();
    for(int i=0;i<MAXK;i++) //重复调用函数以获得充分多的时钟打点数 
     f1(MAXN-1,a,1.1);
    stop=clock();
    duration=((double)(stop-start))/CLK_TCK/MAXK;
    printf("ticks1=%f\n",(double)(stop-start));
    printf("duration1=%6.2e\n",duration); 

    start=clock();
    for(int i=0;i<MAXK;i++)
     f2(MAXN-1,a,1.1);
    stop=clock();
    duration=((double)(stop-start))/CLK_TCK;
    printf("ticks2=%f\n",(double)(stop-start));
    printf("duration2=%6.2e\n",duration); 
 } 
展开阅读全文
博主设置当前文章不允许评论。

没有更多推荐了,返回首页