c++ 不调用数学库函数如何计算任意数的非整数次幂,如10.3^1.5

发布网友

我来回答

2个回答

热心网友

#include<iostream>
#include<cmath>
#include<iomanip> //输出格式头文件
double mypow(double,int);//乘方函数声明
double mysqrt(double,int);//开方函数声明
int divisor(int,int);//查找两个整数的最大公约函数
void fraction(int *,int *,double);//指数拆分函数声明
using namespace std;
int main()
{
int molecular=0,denominator=1;//定义变量molecular(分子),denominator(分母)
int *p1=&molecular,*p2=&denominator;//定义两个指针指向分子和分母,方便在子函数中修改它们的值
double exponent,radix;
cout<<"请输入底数,radix=";
cin>>radix;
cout<<"请输入指数,exponent=";
cin>>exponent;
if(radix==0 && exponent==0) cout<<"0^0不存在"<<endl;
else if(radix==0) cout<<"0的非0次幂为0,所以0^"<<exponent<<"=0"<<endl;
if(exponent>0) fraction(p1,p2,exponent); //将指数拆分成分子分母形式
else if(exponent<0) fraction(p1,p2,-exponent);
cout<<setiosflags(ios::fixed)<<setprecision(8);
if(radix<0 && denominator%2==0)
{
cout<<radix<<"^"<<exponent<<"在实数范围内没有意义"<<endl;
cout<<radix<<"^"<<exponent<<"="<<mysqrt(mypow(-radix,molecular),denominator)<<"i (i为虚数单位)"<<endl;
}
else if(exponent<0) cout<<radix<<"^"<<exponent<<"="<<mysqrt(1/mypow(radix,molecular),denominator)<<endl;
else cout<<radix<<"^"<<exponent<<"="<<mysqrt(mypow(radix,molecular),denominator)<<endl;
cout<<"使用标准库函数计算的结果:";
cout<<radix<<"^"<<exponent<<"="<<pow(radix,exponent)<<endl;
return 0;
}
double mypow(double x,int n)//计算任意数的整数次幂
{
double power=1;
for(int i=0;i<n;i++)
power*=x;
return power;
}
double mysqrt(double x,int n)//迭代法计算任意数的开任意整数次方(负数的偶数次方除外)
{
double next,my_sqrt=1;
double mypow(double,int);
while(1)
{
next=my_sqrt+(x/mypow(my_sqrt,(n-1))-my_sqrt)/n; //迭代法开任意整数次方,X(n+1)=X_n+(A/Xn^(K-1)-Xn)/K
if((next>my_sqrt?(next-my_sqrt):(my_sqrt-next))<1e-7) break;
else my_sqrt=next;
}
return my_sqrt;
}
int divisor(int molecular,int denominator) //查找最大公约数,用于指数拆分函数中的分子分母化简
{
int divisor,temp;
while(molecular%denominator!=0)
{
temp=molecular%denominator;
molecular=denominator;
denominator=temp;
}
divisor=denominator;
return divisor;
}
void fraction(int *molecular,int *denominator,double exponent)//将指数拆分成分子和分母形式,并化简
{
*molecular=int(exponent*(*denominator));
while((exponent*(*denominator)-(*molecular))>1e-7)
{
*denominator=*denominator*10;
*molecular=int(exponent*(*denominator));
}
int temp=divisor(*molecular,*denominator);
*denominator=*denominator/temp;
*molecular=*molecular/temp;
}

热心网友

#include <iostream>
#include <cmath>
using namespace std;
double Dsqrt(double);
double Dpow(double ,double);
int main()
{
//10.5^1.5==10.5^(3/2)==10.5的三次方再开方
cout<<"(不用cmath函数的)10.5^1.5="<<Dsqrt(Dpow(10.5,3))<<endl;
cout<<"(用cmath函数的)10.5^1.5="<<pow(10.5,1.5)<<endl;
return 0;
}double Dsqrt(double c)//计算一个数的开方,相当于sqrt()
{
double down=0,up=0,mid;
int i=0;
while(1)//这里不知道该怎么说,比如10,这里就算出up=4,down=3
{
if(i*i>c)//因为3*3<10而4*4>10
{
up=i;
down=i-1;
break;
}
i++;
}
for(int a=0;a<100;a++)//用二分法求出一个数的开方
{
mid=(up+down)/2;
if((mid*mid-c)*(up*up-c)<0) down=mid;
else up=mid;
}
return mid;
}double Dpow(double a,double b)//计算一个数的N次方,相当于pow()
{
double y=1;
for(int ii=0;ii<b;ii++)
{
y*=a;
}
return y;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com