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

📄 新建 文本文档.txt

📁 是关于变结构控制的一个简单实例
💻 TXT
📖 第 1 页 / 共 3 页
字号:
http://tb.blog.csdn.net/TrackBack.aspx?PostId=1430857
【C语言库函数源代码】

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


float my_fabs01 (float fnumber)

{

  float ret;

  __asm__ (

     "fabs\n\r" 

     : "=t" (ret) 

     : "0" (fnumber)

  );

  return ret;

}

//直接调用了奔腾系列CPU浮点指令系统中的求浮点数绝对值指令。

 

float my_fabs02(float fnumber)

{

   *( (int *) &fnumber) &=0x7FFFFFFF;

  return fnumber;

}

//取得浮点数的地址,然后把符号位置0。

 

double my_fabs03(double dnumber)

{

  *( ( (int *) & dnumber) + 1) &=0x7FFFFFFF;

  return dnumber;

}

int main()

{

   

   printf("%f\n",my_fabs01(0.000001));

   printf("%f\n",my_fabs01(-0.000001));

   printf("%f\n",my_fabs01(1.1234567));

   printf("%f\n",my_fabs01(-1.1234567));

   

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

   

   printf("%f\n",my_fabs02(0.000001));

   printf("%f\n",my_fabs02(-0.000001));

   printf("%f\n",my_fabs02(1.1234567));

   printf("%f\n",my_fabs02(-1.1234567));

   

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

   

   printf("%f\n",my_fabs03(111111111.0000019));

   printf("%f\n",my_fabs03(-111111111.0000019));

   printf("%f\n",my_fabs03(1234567.12345678));

   printf("%f\n",my_fabs03(-1234567.12345678));

 

   system("pause");

   return 0;

} 

int my_abs(int number)

{

   return (number>= 0 ? number : -number);

}

int my_asmabs(int number)

{

   __asm__(

      "mov %1,%%eax; \n\r"  //由输入寄存器 %1移动到eax

      "or %%eax,%%eax; \n\r" //或运算

      "jge 4f; \n\r"        //SF=OF 跳转

                    //(符号位和溢出位相同的时候,为正数)

      "neg %%eax; \n\r"     //取负数预算指令

      "4:"       

      "mov %%eax,%0; \n\r"  //把eax的值赋给输出寄存器 %0

      :"=r"(number)       //输出寄存器 %0

      :"r"(number)        //输入寄存器 %1

   );

   return number;

}

 

int main()

{

   printf("%d\n",my_asmabs(1));

   printf("%d\n",my_asmabs(-1));

   printf("%d\n",my_asmabs(0x7FFFFFFF));

   printf("%d\n",my_asmabs(-0x7FFFFFFF));

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

long int my_labs(long int number)

{

   return (number>= 0 ? number : -number);

}

 

long int my_asmlabs(long int number)

{

   __asm__(

      "mov %1,%%eax; \n\r"  //由输入寄存器 %1移动到eax

      "or %%eax,%%eax; \n\r" //或运算

      "jge 4f; \n\r"        //SF = OF 跳转

                //(符号位和溢出位相同的时候,为正数)

      "neg %%eax; \n\r"     //取负数预算指令

      "4:"       

      "mov %%eax,%0; \n\r"  //eax值赋给输出寄存器 %0

      :"=r"(number)       //输出寄存器 %0

      :"r"(number)        //输入寄存器 %1

   );

   return number;

}

 

int main()

{

   printf("%d\n",my_asmlabs(1));

   printf("%d\n",my_asmlabs(-1));

   printf("%d\n",my_asmlabs(0x7FFFFFFF));

   printf("%d\n",my_asmlabs(-0x7FFFFFFF));

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

double my_sin(double x)

{

   register double ret;

   __asm__ (

      "fsin"

      : "=t" (ret) 

      : "0" (x)

   );

   return ret;

}//计算x(弧度表示)的正弦值。

int main()

{

   printf("%f\n",sin(0.5));

   printf("%f\n",my_sin(0.5));

   system("pause");

   return 0;

}

【C语言库函数源代码】

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

double my_cos (double x)

{

   register double ret;

   __asm__(

      "fcos"

      : "=t" (ret)

      : "0" (x)

   );

   return ret;

}//计算x(弧度表示)的余弦值。

int main()

{

   printf("%f\n",cos(0.5));

   printf("%f\n",my_cos(0.5));

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

double my_tan(double x)

{

   register double ret;

   register double value;

   __asm__(

      "fptan"

      : "=t" (value), 

      "=u" (ret) 

      : "0" (x)

   );

   return ret;

}//计算x(弧度表示)的正切值。

int main()

{

   printf("%f\n",tan(0.5));

   printf("%f\n",my_tan(0.5));

   system("pause");

   return 0;

}

【C语言库函数源代码】

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

double my_log(double x)

{

   register double ret;

   __asm__(

      "fldln2\n\t"

      "fxch\n\t"

      "fyl2x"

      : "=t" (ret) 

      : "0" (x)

   );

   return ret;

}//计算x的自然对数。

int main()

{

   printf("%f\n",log(1024.1024));

   printf("%f\n",my_log(1024.1024));

   

   system("pause");

   return 0;

} 

C语言库函数源代码】

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

double my_log2(double x)

{

   register double ret;

   __asm__(

      "fld1\n\t"

      "fxch\n\t"

      "fyl2x"

      : "=t" (ret) 

      : "0" (x)

   );

 

   return ret;

}//计算以2为底的对数

int main()

{

   printf("%f\n",log2(1024.1024));

   printf("%f\n",my_log2(1024.1024));

   

   system("pause");

   return 0;

}

【C语言库函数源代码】

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

double my_log10(double x)

{

   register double ret;

   __asm__(

      "fldlg2\n\t"

      "fxch\n\t"

      "fyl2x"

      : "=t" (ret) 

      : "0" (x)

   );

   return ret;

}//计算x的常用对数。

int main()

{

   printf("%f\n",log10(1000000));

   printf("%f\n",my_log10(1024.1024));

   

   system("pause");

   return 0;

} 

C语言库函数源代码】

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

double my_pow(double x, double y)

{

   register double ret, value;

   double r = 1.0;

   long p = (long) y;

 

   if (x == 0.0 && y > 0.0)

      return 0.0;

   if (y == (double) p)

   {

      

      if (p == 0)

        return 1.0;

      if (p < 0)

      {

        p = -p;

        x = 1.0 / x;

      }

      while (1)

      {

        if (p & 1)

           r *= x;

        p >>= 1;

        if (p == 0)

           return r;

        x *= x;

      }

   }

   __asm__(

      "fmul  %%st(1);"

      "fst   %%st(1);"

      "frndint;\n\t"

      "fxch;\n\t"

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

      "f2xm1;\n\t"

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

      :  "0" (log2 (x)), "1" (y)

   );

   ret += 1.0;

   __asm__(

      "fscale"

      : "=t" (ret) 

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

   );

   return ret;

}

//这是一个求x的y次幂的函数,因为要求是浮点数类型的,所以代码复杂了许多。

//如果仅仅是求整数的x的y次幂,那么就简单了许多。

int main()

{

   printf("%f\n",my_pow(0.0,0.0));

   printf("%f\n",my_pow(1024.0,0.0));

   printf("%f\n",my_pow(2.0,10.0));

   printf("%f\n",pow(2.5,12.6));

   printf("%f\n",my_pow(2.5,12.6));

   system("pause");

   return 0;

}

【C语言库函数源代码】

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

double my_pow10(double x)

{

   register double ret, value;

   __asm__(

      "fldl2t;\n\t"

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

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

      "frndint;\n\t"

      "fxch;\n\t"

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

      "f2xm1 ;\n\t"

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

      : "0" (x)

   );

   ret += 1.0;

   __asm__(

      "fscale"

      : "=t" (ret) 

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

   );

   return ret;

}//求10的x次幂(类似于求解exp的x次幂的算法)

int main()

{

   printf("%f\n",my_pow10(0.0));

   printf("%f\n",my_pow10(4));

   printf("%f\n",my_pow10(20));

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

double my_sqrt(double x)

{

   register double ret;

   __asm__(

      "fsqrt"

      : "=t" (ret) 

      : "0" (x)

      );

 

   return ret;

}//计算x的平方根。

int main()

{

   double a = 4;

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

   a = 81;

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

   a = 12345678;

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

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

double my_ceil(double x)

{

   register double ret;

   unsigned short int temp1, temp2;

   

   __asm__("fnstcw %0" : "=m" (temp1));

   temp2 = (temp1 & 0xf3ff) | 0x0800; /* rounding up */

   __asm__("fldcw %0" : : "m" (temp2));

   __asm__("frndint" : "=t" (ret) : "0" (x));

   __asm__("fldcw %0" : : "m" (temp1));

   

   return ret;

}//向上取整

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

double my_ceil01(double x)

{

   double y=x;

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

        return (float)((int)x);

    else                 //讨论非负的情况。

   {

        if(x == 0)

        return (float)((int)x);

        else

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

   }

}

 

int main()

{

   double a = 88.8;

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

   a = -88.8;

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

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

   a = 88.8;

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

   a = -88.8;

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

 

   system("pause");

   return 0;

} 

【C语言库函数源代码】

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

double my_floor(double x)

{

   register double ret;

   unsigned short int temp1, temp2;

 

   __asm__("fnstcw %0" : "=m" (temp1));

   temp2 = (temp1 & 0xf3ff) | 0x0400; /* rounding down */

   __asm__ ("fldcw %0" : : "m" (temp2));

   __asm__ ("frndint" : "=t" (ret) : "0" (x));

   __asm__ ("fldcw %0" : : "m" (temp1));

 

   return ret;

⌨️ 快捷键说明

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