#include "SDL_internal.h"1/*2* ====================================================3* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.4*5* Developed at SunPro, a Sun Microsystems, Inc. business.6* Permission to use, copy, modify, and distribute this7* software is freely granted, provided that this notice8* is preserved.9* ====================================================10*/1112/*13* floor(x)14* Return x rounded toward -inf to integral value15* Method:16* Bit twiddling.17* Exception:18* Inexact flag raised if x not equal to floor(x).19*/2021/*#include <features.h>*/22/* Prevent math.h from defining a colliding inline */23#undef __USE_EXTERN_INLINES24#include "math_libm.h"25#include "math_private.h"2627#ifdef __WATCOMC__ /* Watcom defines huge=__huge */28#undef huge29#endif3031static const double huge = 1.0e300;3233double floor(double x)34{35int32_t i0,i1,j0;36u_int32_t i,j;37EXTRACT_WORDS(i0,i1,x);38j0 = ((i0>>20)&0x7ff)-0x3ff;39if(j0<20) {40if(j0<0) { /* raise inexact if x != 0 */41if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */42if(i0>=0) {i0=i1=0;}43else if(((i0&0x7fffffff)|i1)!=0)44{ i0=0xbff00000;i1=0;}45}46} else {47i = (0x000fffff)>>j0;48if(((i0&i)|i1)==0) return x; /* x is integral */49if(huge+x>0.0) { /* raise inexact flag */50if(i0<0) i0 += (0x00100000)>>j0;51i0 &= (~i); i1=0;52}53}54} else if (j0>51) {55if(j0==0x400) return x+x; /* inf or NaN */56else return x; /* x is integral */57} else {58i = ((u_int32_t)(0xffffffff))>>(j0-20);59if((i1&i)==0) return x; /* x is integral */60if(huge+x>0.0) { /* raise inexact flag */61if(i0<0) {62if(j0==20) i0+=1;63else {64j = i1+(1<<(52-j0));65if(j<(u_int32_t)i1) i0 +=1 ; /* got a carry */66i1=j;67}68}69i1 &= (~i);70}71}72INSERT_WORDS(x,i0,i1);73return x;74}75libm_hidden_def(floor)767778