📄 新建 文本文档.txt
字号:
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 + -