【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;
}