📄 新建 文本文档.txt
字号:
}//向下取整
//下面是俺自己写的向下取整的函数
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 + -