support/fdlibm/s_ceil.c
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 23 Jan 2013 12:31:33 +0000
branchdevelopment
changeset 1988 0fcf5a5dcb66
parent 1818 2e5ed72e7dfd
child 2380 9195eccdcbd9
permissions -rw-r--r--
Cleanup in JavaRelease: javaHome/jreHome/jdkHome.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
986
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     1
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     2
/* @(#)s_ceil.c 1.3 95/01/18 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     3
/*
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     4
 * ====================================================
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     5
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     6
 *
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     7
 * Developed at SunSoft, a Sun Microsystems, Inc. business.
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     8
 * Permission to use, copy, modify, and distribute this
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
     9
 * software is freely granted, provided that this notice 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    10
 * is preserved.
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    11
 * ====================================================
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    12
 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    13
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    14
/*
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    15
 * ceil(x)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    16
 * Return x rounded toward -inf to integral value
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    17
 * Method:
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    18
 *	Bit twiddling.
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    19
 * Exception:
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    20
 *	Inexact flag raised if x not equal to ceil(x).
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    21
 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    22
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    23
#include "fdlibm.h"
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    24
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    25
#ifdef __STDC__
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    26
static const double huge = 1.0e300;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    27
#else
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    28
static double huge = 1.0e300;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    29
#endif
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    30
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    31
#ifdef __STDC__
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    32
	double ceil(double x)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    33
#else
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    34
	double ceil(x)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    35
	double x;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    36
#endif
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    37
{
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    38
	int i0,i1,j0;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    39
	unsigned i,j;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    40
	i0 =  __HI(x);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    41
	i1 =  __LO(x);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    42
	j0 = ((i0>>20)&0x7ff)-0x3ff;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    43
	if(j0<20) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    44
	    if(j0<0) { 	/* raise inexact if x != 0 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    45
		if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    46
		    if(i0<0) {i0=0x80000000;i1=0;} 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    47
		    else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    48
		}
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    49
	    } else {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    50
		i = (0x000fffff)>>j0;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    51
		if(((i0&i)|i1)==0) return x; /* x is integral */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    52
		if(huge+x>0.0) {	/* raise inexact flag */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    53
		    if(i0>0) i0 += (0x00100000)>>j0;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    54
		    i0 &= (~i); i1=0;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    55
		}
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    56
	    }
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    57
	} else if (j0>51) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    58
	    if(j0==0x400) return x+x;	/* inf or NaN */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    59
	    else return x;		/* x is integral */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    60
	} else {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    61
	    i = ((unsigned)(0xffffffff))>>(j0-20);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    62
	    if((i1&i)==0) return x;	/* x is integral */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    63
	    if(huge+x>0.0) { 		/* raise inexact flag */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    64
		if(i0>0) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    65
		    if(j0==20) i0+=1; 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    66
		    else {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    67
			j = i1 + (1<<(52-j0));
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    68
			if(j<i1) i0+=1;	/* got a carry */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    69
			i1 = j;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    70
		    }
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    71
		}
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    72
		i1 &= (~i);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    73
	    }
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    74
	}
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    75
	__HI(x) = i0;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    76
	__LO(x) = i1;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    77
	return x;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    78
}