Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/sdl/libm/s_modf.c
9903 views
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
26
static const double one = 1.0;
27
28
double 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
}
68
libm_hidden_def(modf)
69
70