📄 pow_user.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <fstream.h>
#include <iostream.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
double pow_i(double num,int n) //计算num的n次幂,其中n为整数
{
double powint;
powint = 1;
for(int i=1; i<=n; i++) powint*=num;
return powint;
}
double pow_f(double num, double m) // 计算num的m次幂,num和m可为双精度,num大于零
{
int i, j;
double powf, x, tmpm;
powf = 0;
tmpm = 1;
x = num - 1;
for(i=1; tmpm>1e-12 || tmpm<-1e-12; i++) //当tmpm不在次范围时,停止循环,范围可改
{
for(j=1,tmpm=1; j<=i; j++)
{
tmpm*=(m-j+1)*x/j;
}
powf+=tmpm;
}
return powf+1;
}
double pow_user(double num, double m) // 调用pow_f()和pow_i(),计算num的m次幂,是计算幂的入口
{
if(num==0 && m!=0)
{
return 0; //若num为0,则返回0
}
else
{
if(num==0 && m==0)
{
return 1; // 若num和m都为0,则返回1
}
else
{
if(num<0 && m-int(m)!=0) return 0; //若num为负,且m不为整数数,则出错,返回0
}
}
if(num>2) // 把底数大于2的情况转为(1/num)^-m计算
{
num = 1.0/num;
m = -m;
}
if(m<0) return 1.0/pow_user(num, -m); // 把指数小于0的情况转为1/num^-m计算
/*
当指数为浮点数是,分成整数和小数分别求幂,这是因为但底数较小式,
用pow_f直接求幂误差大,所以分为指数的整数部分
用pow_i小数部分用pow_f求.
*/
if(m-int(m)==0)
{
return pow_i(num, m);
}
else
{
return pow_f(num, m-int(m))*pow_i(num, int(m));
}
return pow_f(num, m);
}
int main(int argc, char* argv[])
{
double num, m, ans;
num = 9.1;
m = -0.56;
ans = pow_user(num, m);
cout<<"answer = "<<ans<<endl;
puts("Press any key to continue...");
getchar();
return 0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -