⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 是关于变结构控制的一个简单实例
💻 TXT
📖 第 1 页 / 共 3 页
字号:
}//向下取整

//下面是俺自己写的向下取整的函数

double my_floor01(double x)

{

   double y=x;

    if( (*( ( (int *) &y)+1) & 0x80000000)  != 0) //或者if(x<0)

        return (float)((int)x)-1;

    else

        return (float)((int)x);

}

int main()

{

   double a = 88.8;

   printf("floor(%f) = %f\n",a,my_floor(a));

   a = -88.8;

   printf("floor(%f) = %f\n",a,my_floor(a));

   printf("****************************\n");

   a = 88.8;

   printf("floor(%f) = %f\n",a,my_floor01(a));

   a = -88.8;

   printf("floor(%f) = %f\n",a,my_floor01(a));

 

   system("pause");

   return 0;

}

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double my_exp(double x)

{

   register double ret, value;

   __asm__(

      "fldl2e;"    

      "fmul %%st(1);"

      "fst  %%st(1);\n\t"

      "frndint;"         

      "fxch;\n\t"

      "fsub %%st(1);"  

      "f2xm1" 

      : "=t" (ret), "=u" (value) 

      : "0" (x)

   );

   

   ret += 1.0;

 

   __asm__(

      "fscale"

      : "=t" (ret) 

      : "0" (ret), "u" (value)

   );

 

   return ret;

}//求e的x次幂

int main()

{

   double a = 1;

   printf("exp(%f) = %f\n",a,exp(a));

   printf("exp(%f) = %f\n",a,my_exp(a));

   a = 9.9;

   printf("exp(%f) = %f\n",a,exp(a));

   printf("exp(%f) = %f\n",a,my_exp(a));

   

   system("pause");

   return 0;

}

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double atan2 (double x, double y)

{

   register double ret;

   __asm__(

      "fpatan\n\t"

      "fld %%st(0)"

      : "=t" (ret) 

      : "0" (y), "u" (x)

   );

   

   return ret;

}//求x / y的反正切值。

 

double my_asin(double x)

{

   return atan2 (x, sqrt (1.0 - x * x));

}//求x的反正弦值。

int main()

{

   double a = 0.5;

   printf("asin(%f)    = %f\n",a,asin(a));

   printf("my_asin(%f) = %f\n",a,my_asin(a));

   a = -0.5;

   printf("asin(%f)    = %f\n",a,asin(a));

   printf("my_asin(%f) = %f\n",a,my_asin(a));

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double my_atan(double x)

{

   register double ret;

   __asm__(

      "fld1\n\t"

      "fpatan"

      : "=t" (ret) 

      : "0" (x)

   );

   

   return ret;

}//求x的反正切值。

int main()

{

   double a = 0.5;

   printf("atan(%f)    = %f\n",a,atan(a));

   printf("my_atan(%f) = %f\n",a,my_atan(a));

   a = -0.5;

   printf("atan(%f)    = %f\n",a,atan(a));

   printf("my_atan(%f) = %f\n",a,my_atan(a));

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double atan2 (double x, double y)

{

   register double ret;

   __asm__(

      "fpatan\n\t"

      "fld %%st(0)"

      : "=t" (ret) 

      : "0" (y), "u" (x)

   );

   

   return ret;

}//求x / y的反正切值。

double my_acos(double x)

{

  return atan2 (sqrt (1.0 - x * x), x);

}//求x的反余弦值。

int main()

{

   double a = 0.5;

   printf("acos(%f)    = %f\n",a,acos(a));

   printf("my_acos(%f) = %f\n",a,my_acos(a));

   a = -0.5;

   printf("acos(%f)    = %f\n",a,acos(a));

   printf("my_acos(%f) = %f\n",a,my_acos(a));

   

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double my_cosh(double x)

{

   double ret;

   ret = exp(fabs(x));

   return (ret + 1.0/ret) / 2.0;

}//计算x的双曲余弦值。

int main()

{

   double a = 0.5;

   printf("cosh(%f)    = %f\n",a,cosh(a));

   printf("my_cosh(%f) = %f\n",a,my_cosh(a));

   a = -0.5;

   printf("cosh(%f)    = %f\n",a,cosh(a));

   printf("my_cosh(%f) = %f\n",a,my_cosh(a));

   

   system("pause");

   return 0;

}

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double my_sinh(double x)

{

   double ret;

   if(x >= 0.0)

   {

      ret = exp(x);

      return (ret - 1.0/ret) / 2.0;

   }

   else

   {

      ret = exp(-x);

      return (1.0/ret - ret) / 2.0;

   }

}//计算x的双曲正弦值。

int main()

{

   double a = 0.5;

   printf("sinh(%f)    = %f\n",a,sinh(a));

   printf("my_sinh(%f) = %f\n",a,my_sinh(a));

   a = -0.5;

   printf("sinh(%f)    = %f\n",a,sinh(a));

   printf("my_sinh(%f) = %f\n",a,my_sinh(a));

   

   system("pause");

   return 0;

}

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

double my_tanh(double x)

{

   double ret,temp;

   if (x > 50)

      return 1;

   else if (x < -50)

      return -1;

   else

   {

      ret = exp(x);

      temp = 1.0 / ret;

      return ( (ret - temp) / (ret + temp));

   }

}//计算x的双曲正切值。

 

int main()

{

   double a = 0.5;

   printf("tanh(%f)    = %f\n",a,tanh(a));

   printf("my_tanh(%f) = %f\n",a,my_tanh(a));

   a = -0.5;

   printf("tanh(%f)    = %f\n",a,tanh(a));

   printf("my_tanh(%f) = %f\n",a,my_tanh(a));

   

   system("pause");

   return 0;

}

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

/*

   把浮点数x分解成尾数和指数。x=m*2^exptr,m为规格化小数。

   返回尾数m,并将指数存入exptr中。

*/

double my_frexp01(double x, int *exptr)

{

   union 

   {

      double d;

      unsigned char c[8];

   } u;

   u.d = x;

   //得到移码,并减去1022得到指数值。

   *exptr = (int)(((u.c[7] & 0x7f) << 4) | (u.c[6] >> 4)) - 1022;

   //把指数部分置为0x03FE

   u.c[7] &= 0x80;

   u.c[7] |= 0x3f;

   u.c[6] &= 0x0f;

   u.c[6] |= 0xe0;

   return u.d;

}

double my_frexp02(double x, int *eptr)

{

   union 

   {

      double v;

      struct 

      {

        unsigned mantissa2 : 32;

        unsigned mantissa1 : 20;

        unsigned exponent : 11;

        unsigned sign :  1;

      } s;

   } u;

   if (x) 

   {

      u.v = x;

      //得到移码,并减去1022得到指数值。

      *eptr = u.s.exponent - 1022;

      //把指数部分置为0x03FE

      u.s.exponent = 1022;

      return(u.v);

   } 

   else 

   {

      *eptr = 0;

      return((double)0);

   }

}

main()

{

   float x,y;

   int exp;

   

   y = 64.0;

   x = my_frexp01(y,&exp);

   printf("%f=%.2f*2^%d\n",y,x,exp);

   x = my_frexp01(-y,&exp);

   printf("%f=%.2f*2^%d\n",y,x,exp);

   

   printf("\n************************\n");

   

   x = my_frexp02(y,&exp);

   printf("%f=%.2f*2^%d\n",y,x,exp);

   x = my_frexp02(-y,&exp);

   printf("%f=%.2f*2^%d\n",y,x,exp);

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

/*

   装载浮点数,v是尾数,e为指数。

   如:x=ldexp(1.0,6);则表示要转载的浮点数是1.0*2^6

*/

double my_ldexp01(double v, int e)

{

   double two = 2.0;

   if (e < 0)

   {

      e = -e; /*这句话和后面的if语句是用来对两位溢出码的机器*/

      if (e < 0) return 0.0;

      while (e > 0)

      {

        if (e & 1) v /= two;

        two *= two;

         e >>= 1;

      }

   }

   else if (e > 0)

   {

      while (e > 0)

      {

        if (e & 1) v *= two;

        two *= two;

        e >>= 1;

      }

   }

   return v;

}

double my_ldexp02(double v, int e)

{

   double temp1, texp, temp2;

   texp = e;

   __asm__(

      "fscale "

      : "=u" (temp2), "=t" (temp1)

      : "0" (texp), "1" (v)

   );

   return (temp1);

}

main()

{

   float x,y;

   

   y = 1.0;

   x=my_ldexp01(y,6);  // 1.0*2^6

   printf("2^6=%.2f\n",x);

   x=my_ldexp01(-y,6);  // 1.0*2^6

   printf("2^6=%.2f\n",x);

   x=my_ldexp02(y,6);  // 1.0*2^6

   printf("2^6=%.2f\n",x);

   x=my_ldexp02(-y,6);  // 1.0*2^6

   printf("2^6=%.2f\n",x);

   

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

/*

   计算x/y的余数。返回x-n*y,符号同y。

   n=[x/y](向离开零的方向取整)

*/

double my_fmod01(double x, double y)

{

   register double ret;

   __asm__(

      "1:     fprem\n\t"

      "fstsw   %%ax\n\t"

      "sahf\n\t"

      "jp        1b"

      : "=t" (ret) 

      : "0" (x), "u" (y) 

      : "ax", "cc"

   );

 

   return ret;

}

double my_fmod02(double x, double y)

{

   double temp, ret;

   

   if (y == 0.0) 

      return 0.0;

   temp = floor(x/y);

   ret = x - temp * y;

   if ((x < 0.0) != (y < 0.0))

      ret = ret - y;

   return ret;

}

int main()

{

   double x,y;

   

   x = 80.8,y = 3.0;

 

   printf("fmod(%f,%f)      = %f\n",x,y,fmod(x,y));

   printf("my_fmod01(%f,%f) = %f\n",x,y,my_fmod01(x,y));

   printf("my_fmod02(%f,%f) = %f\n",x,y,my_fmod01(x,y));

   

   printf("\n******************************************\n");

   

   x = -55.968,y = 8.8;

   printf("fmod(%f,%f)      = %f\n",x,y,fmod(x,y));

   printf("my_fmod01(%f,%f) = %f\n",x,y,my_fmod01(x,y));

   printf("my_fmod02(%f,%f) = %f\n",x,y,my_fmod01(x,y));

   

   system("pause");

   return 0;

} 

【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -