/*
double 数 n 可表示为 m * 2^e ( 1<=m<2, e为整数)
m称为n的尾数,e称为n的阶码
*/
short GetExpBase2(double a) // 获得 a 的阶码
{
// 按照IEEE 754浮点数格式,取得阶码,仅仅适用于Intel 系列 cpu
WORD *pWord=(WORD *)(&a)+3;
WORD rank = ( (*pWord & 0x7fff) >>4 );
return (short)(rank-0x3ff);
}
double GetMantissa(double a) // 获得 a 的 尾数
{
// 按照IEEE 754浮点数格式,取得尾数,仅仅适用于Intel 系列 cpu
double r=a;
WORD *pWord=(WORD *)(&r)+3;
switch ( dwMantissa)
{
case 0: break;
case 1: x0 *=0.8858;break;
case 2: x0 *=0.7901;break;
case 3: x0 *=0.7091;break;
case 4: x0 *=0.6400;break;
case 5: x0 *=0.5805;break;
case 6: x0 *=0.5289;break;
case 7: x0 *=0.4839;break;
case 8: x0 *=0.4444;break;
case 9: x0 *=0.4096;break;
case 10: x0 *=0.3787;break;
case 11: x0 *=0.3512;break;
case 12: x0 *=0.3265;break;
case 13: x0 *=0.3044;break;
case 14: x0 *=0.2844;break;
case 15: x0 *=0.2664;break;
}
除了里面介绍的方法,也可以考虑二分法试算:
当被开方数 y 大于1时:选初始 max = y, min = 1.0,try = (max + min)/2;
当被开方数 y 小于1时:选初始 max = 1.0, min = y,try = (max + min)/2;
比较 try^2 与 y 的大小,修正 max 或 min 的值进行下一次迭代,直到达到预期精度。
short GetExpBase2(double a)
{
// 按照IEEE 754浮点数格式,取得阶码,仅仅适用于Intel 系列 cpu
WORD *pWord=(WORD *)(&a)+3;
WORD rank = ( (*pWord & 0x7fff) >>4 );
return (short)(rank-0x3ff);
}
//当n较大时,这个函数效率较低
//当n较大,可以使用平方算法优化
double pow(double a,int n)
{
if (n<=0)
return 0;
else if (n==0)
return 1;
else if (n==1)
return n;
//----------------------------
double r=a;
for (int i=1;i<n;i++)
r *=a;
return r;
}
//计算2 ^ n
double pow2(int n)
{
double r=1.00;
int i;
if ( n >0)
{
for (i=0;i<n;i++) r *=2 ;
}
else
{
for (i=0;i<-n;i++) r /=2 ;
}
return r;
}
//计算 a的绝对值
double myAbs(double a)
{
if (a <0) return 0-a;
else return a;
}
// 返回 1/a 的初值(近似值)
double reciprocal_0(double a)
{
// 按照IEEE 754浮点数格式,求其倒数,仅仅适用于Intel 系列 cpu
double x0=a;
WORD dwMantissa; //尾数高4位
WORD rank;
WORD *pWord=(WORD *)(&x0)+3;
dwMantissa= *pWord & 0x000f;
rank= (~(*pWord) + 0x7ff0);
*pWord = ((dwMantissa) | ( rank & 0xfff0 ));
switch ( dwMantissa)
{
case 0: break;
case 1: x0 *=0.8858;break;
case 2: x0 *=0.7901;break;
case 3: x0 *=0.7091;break;
case 4: x0 *=0.6400;break;
case 5: x0 *=0.5805;break;
case 6: x0 *=0.5289;break;
case 7: x0 *=0.4839;break;
case 8: x0 *=0.4444;break;
case 9: x0 *=0.4096;break;
case 10: x0 *=0.3787;break;
case 11: x0 *=0.3512;break;
case 12: x0 *=0.3265;break;
case 13: x0 *=0.3044;break;
case 14: x0 *=0.2844;break;
case 15: x0 *=0.2664;break;
}
我用了您提供的(2)方法中的x^r1 / (x^r2);但是计算结果不正确啊,我的代码在下面:
代码是VB的
Private Sub Command1_Click()
Dim X As Double, R As Double, R0 As Double, R1 As Double, _
R2 As Double
'9 ^ 1.6
X = 9: R = 1.6