support/fdlibm/e_remainder.c
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 31 Jan 2013 15:18:47 +0000
branchrefactoring-vmdata
changeset 2021 75e48299fc2d
parent 1818 2e5ed72e7dfd
child 2380 9195eccdcbd9
permissions -rw-r--r--
Added a number of unimplemented native methods.
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
/* @(#)e_remainder.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
/* __ieee754_remainder(x,p)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    15
 * Return :                  
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    16
 * 	returns  x REM p  =  x - [x/p]*p as if in infinite 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    17
 * 	precise arithmetic, where [x/p] is the (infinite bit) 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    18
 *	integer nearest x/p (in half way case choose the even one).
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    19
 * Method : 
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    20
 *	Based on fmod() return x-[x/p]chopped*p exactlp.
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 zero = 0.0;
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 zero = 0.0;
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
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    32
#ifdef __STDC__
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    33
	double __ieee754_remainder(double x, double p)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    34
#else
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    35
	double __ieee754_remainder(x,p)
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    36
	double x,p;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    37
#endif
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    38
{
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    39
	int hx,hp;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    40
	unsigned sx,lx,lp;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    41
	double p_half;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    42
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    43
	hx = __HI(x);		/* high word of x */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    44
	lx = __LO(x);		/* low  word of x */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    45
	hp = __HI(p);		/* high word of p */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    46
	lp = __LO(p);		/* low  word of p */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    47
	sx = hx&0x80000000;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    48
	hp &= 0x7fffffff;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    49
	hx &= 0x7fffffff;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    50
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    51
    /* purge off exception values */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    52
	if((hp|lp)==0) return (x*p)/(x*p); 	/* p = 0 */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    53
	if((hx>=0x7ff00000)||			/* x not finite */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    54
	  ((hp>=0x7ff00000)&&			/* p is NaN */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    55
	  (((hp-0x7ff00000)|lp)!=0)))
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    56
	    return (x*p)/(x*p);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    57
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    58
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    59
	if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p);	/* now x < 2p */
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    60
	if (((hx-hp)|(lx-lp))==0) return zero*x;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    61
	x  = fabs(x);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    62
	p  = fabs(p);
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    63
	if (hp<0x00200000) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    64
	    if(x+x>p) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    65
		x-=p;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    66
		if(x+x>=p) x -= p;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    67
	    }
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    68
	} else {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    69
	    p_half = 0.5*p;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    70
	    if(x>p_half) {
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    71
		x-=p;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    72
		if(x>=p_half) x -= p;
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) ^= sx;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    76
	return x;
a53b146a146d Added fdlibm for IEE754-style double arithmetics
vranyj1
parents:
diff changeset
    77
}