#1.1.2计算给定多项式在给定x值时的值

1 知识内容

在这里插入图片描述
第二种方法效率更高。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现全是0的错误,这是因为函数跑的太快都不到一个tick,clock函数根本捕捉不到区别
在这里插入图片描述

2实践

2.1 #define

1.简单的define定义

#define MAXTIME 1000

一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写

if(i<MAXTIME){…}

编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。

这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。

2.define的“函数定义”

define可以像函数那样接受一些参数,如下

#define max(x,y) (x)>(y)?(x):(y);

这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。

但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
ca + bd

另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。

所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。

2.2代码

在这里插入图片描述
测试了一下机器时钟每秒走1000下

#include "pch.h"
#include <iostream>
#include<time.h>
#include<math.h>
#define MAXN 10
clock_t start ,stop;
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
int main()
{
	double a[MAXN];
	int i;
	for (i = 0; i < MAXN; i++) {
		a[i] = (double)i;
	};
	start = clock();
	for (i = 0; i < 1e7; i++) {
		f1(MAXN - 1, a, 1.1);
	};
	stop = clock(); 
    std::cout <<(double)(stop-start)<<"\n";
	std::cout << ((double)(stop - start) / CLK_TCK)<<"\n";
	printf("%d\n", CLK_TCK);

	start = clock();
	for (i = 0; i < 1e7; i++) {
		f2(MAXN - 1, a, 1.1);
	};
	stop = clock();
	std::cout <<(double) (stop - start) << "\n";
	std::cout << (double)((double)(stop - start)/CLK_TCK) << "\n";
	printf("%d\n", CLK_TCK);

	return 0;
}

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;
}

还测试了下自己电脑的CLK_tck为1000,并计算了下自己的时间
在这里插入图片描述
上数中第一个为机械时针击打次数,第二个为时间第三个为CLK_TCK。约为10倍关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值