[C language library function source code]
[This program is compiled in 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;
} // Round down
// The following is the rounded down function written by myself.
Double my_floor01 (Double X)
{
Double Y = X;
If (* (int *) & Y) + 1) & 0x80000000 )! = 0) // or 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 =-88.8;
Printf ("floor (% F) = % F/N", A, my_floor ());
Printf ("****************************/N ");
A = 88.8;
Printf ("floor (% F) = % F/N", A, my_floor01 ());
A =-88.8;
Printf ("floor (% F) = % F/N", A, my_floor01 ());
System ("pause ");
Return 0;
}