Atlas - s_modf.c
Home / ext / SDL / src / libm Lines: 1 | Size: 1781 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1#include "SDL_internal.h" 2/* 3 * ==================================================== 4 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. 5 * 6 * Developed at SunPro, a Sun Microsystems, Inc. business. 7 * Permission to use, copy, modify, and distribute this 8 * software is freely granted, provided that this notice 9 * is preserved. 10 * ==================================================== 11 */ 12 13/* 14 * modf(double x, double *iptr) 15 * return fraction part of x, and return x's integral part in *iptr. 16 * Method: 17 * Bit twiddling. 18 * 19 * Exception: 20 * No exception. 21 */ 22 23#include "math_libm.h" 24#include "math_private.h" 25 26static const double one = 1.0; 27 28double modf(double x, double *iptr) 29{ 30 int32_t i0,i1,_j0; 31 u_int32_t i; 32 EXTRACT_WORDS(i0,i1,x); 33 _j0 = ((i0>>20)&0x7ff)-0x3ff; /* exponent of x */ 34 if(_j0<20) { /* integer part in high x */ 35 if(_j0<0) { /* |x|<1 */ 36 INSERT_WORDS(*iptr,i0&0x80000000,0); /* *iptr = +-0 */ 37 return x; 38 } else { 39 i = (0x000fffff)>>_j0; 40 if(((i0&i)|i1)==0) { /* x is integral */ 41 *iptr = x; 42 INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */ 43 return x; 44 } else { 45 INSERT_WORDS(*iptr,i0&(~i),0); 46 return x - *iptr; 47 } 48 } 49 } else if (_j0>51) { /* no fraction part */ 50 *iptr = x*one; 51 /* We must handle NaNs separately. */ 52 if (_j0 == 0x400 && ((i0 & 0xfffff) | i1)) 53 return x*one; 54 INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */ 55 return x; 56 } else { /* fraction part in low x */ 57 i = ((u_int32_t)(0xffffffff))>>(_j0-20); 58 if((i1&i)==0) { /* x is integral */ 59 *iptr = x; 60 INSERT_WORDS(x,i0&0x80000000,0); /* return +-0 */ 61 return x; 62 } else { 63 INSERT_WORDS(*iptr,i0,i1&(~i)); 64 return x - *iptr; 65 } 66 } 67} 68libm_hidden_def(modf) 69[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.