C语言学习———pow的使用


在使用在整型计算中,如果次方数过大,使用 pow 会出现一些问题。

比如这两个代码,本质上计算是相同,并没有什么区别。

#include <stdio.h>
#include <math.h>
int main()
{
	long long s=0,a;
	for (int i=1;i<=60;i++){
	    s+=pow(2,i-1);
	}
	printf("%lld",s);
	
	return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
	long long s=0,a;
	for (int i=1;i<=60;i++){
	    a=pow(2,i-1);
            s+=a;
	}
	printf("%lld",s);
	
	return 0;
}

运行结果如下(不怎么会调图片大小,就放原截图了)

发现运行结果差1

调试中

在循环当中插入

printf("%d %lld\n",i,s);

发现是进行第54次循环时出现了问题

和同学讨论,发现了原因出在哪里,并解决了这个问题

C语言 pow 的原函数是 double pow,计算的结果返回的是 double,也就是双精度。
所以我们要自我设定一个关于 long long 类型的 pow 函数。

long long longpow(int x,int y)
{
	int i;
	long long p=1;
	for (i=1;i<=y;i++){
		p*=x;
	}
	return(p);
}

运行的前面两种方式(附代码和运行结果)

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

int main()
{
	long long longpow(int x,int y);
	long long s=0,a=0;
	for (int i=1;i<=60;i++){
		s+=longpow(2,i-1);
	}
	printf("%lld",s);
	
	return 0;
}

long long longpow(int x,int y)
{
	int i;
	long long p=1;
	for (i=1;i<=y;i++){
		p*=x;
	}
	return(p);
}

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

int main()
{
	long long longpow(int x,int y);
	long long s=0,a=0;
	for (int i=1;i<=60;i++){
		a=longpow(2,i-1);
		s+=a;
	}
	printf("%lld",s);
	
	return 0;
}

long long longpow(int x,int y)
{
	int i;
	long long p=1;
	for (i=1;i<=y;i++){
		p*=x;
	}
	return(p);
}

这是写博客的第三次,不好请多多担待


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM