GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libm/src/s_modff.c Lines: 0 14 0.0 %
Date: 2017-11-07 Branches: 0 6 0.0 %

Line Branch Exec Source
1
/* s_modff.c -- float version of s_modf.c.
2
 * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
3
 */
4
5
/*
6
 * ====================================================
7
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
8
 *
9
 * Developed at SunPro, a Sun Microsystems, Inc. business.
10
 * Permission to use, copy, modify, and distribute this
11
 * software is freely granted, provided that this notice
12
 * is preserved.
13
 * ====================================================
14
 */
15
16
#include "math.h"
17
#include "math_private.h"
18
19
static const float one = 1.0;
20
21
float
22
modff(float x, float *iptr)
23
{
24
	int32_t i0,jj0;
25
	u_int32_t i;
26
	GET_FLOAT_WORD(i0,x);
27
	jj0 = ((i0>>23)&0xff)-0x7f;	/* exponent of x */
28
	if(jj0<23) {			/* integer part in x */
29
	    if(jj0<0) {			/* |x|<1 */
30
	        SET_FLOAT_WORD(*iptr,i0&0x80000000);	/* *iptr = +-0 */
31
		return x;
32
	    } else {
33
		i = (0x007fffff)>>jj0;
34
		if((i0&i)==0) {			/* x is integral */
35
		    u_int32_t ix;
36
		    *iptr = x;
37
		    GET_FLOAT_WORD(ix,x);
38
		    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
39
		    return x;
40
		} else {
41
		    SET_FLOAT_WORD(*iptr,i0&(~i));
42
		    return x - *iptr;
43
		}
44
	    }
45
	} else {			/* no fraction part */
46
	    u_int32_t ix;
47
	    *iptr = x*one;
48
	    GET_FLOAT_WORD(ix,x);
49
	    SET_FLOAT_WORD(x,ix&0x80000000);	/* return +-0 */
50
	    return x;
51
	}
52
}