Exemple #1
0
//////////////////////////////////////////////////////////////////////
// scattering function at a point
//////////////////////////////////////////////////////////////////////
float APSF::pointAPSF(float mu)
{
  float total = 0.0f;

  for (int m = 0; m < _maxTerms; m++)
    total += (gM(_I0, m) + gM(_I0, m + 1)) * legendreM(m, mu);
    
  return total;
}
Exemple #2
0
double fd_nextafter(double x, double y)
{
	int	hx,hy,ix,iy;
	unsigned lx,ly;

	hx = FD_HI(x);		/* high word of x */
	lx = FD_LO(x);		/* low  word of x */
	hy = FD_HI(y);		/* high word of y */
	ly = FD_LO(y);		/* low  word of y */
	ix = hx&0x7fffffff;		/* |x| */
	iy = hy&0x7fffffff;		/* |y| */

	if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) ||   /* x is nan */ 
	   ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0))     /* y is nan */ 
	   return x+y;				
	if(x==y) return x;		/* x=y, return x */
	if((ix|lx)==0) {			/* x == 0 */
	    FD_HI(x) = hy&0x80000000;	/* return +-minsubnormal */
	    FD_LO(x) = 1;
	    y = x*x;
	    if(y==x) return y; else return x;	/* raise underflow flag */
	} 
	if(hx>=0) {				/* x > 0 */
	    if(hx>hy||((hx==hy)&&(lx>ly))) {	/* x > y, x -= ulp */
		if(lx==0) hx -= 1;
		lx -= 1;
	    } else {				/* x < y, x += ulp */
		lx += 1;
		if(lx==0) hx += 1;
	    }
	} else {				/* x < 0 */
	    if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){/* x < y, x -= ulp */
		if(lx==0) hx -= 1;
		lx -= 1;
	    } else {				/* x > y, x += ulp */
		lx += 1;
		if(lx==0) hx += 1;
	    }
	}
	hy = hx&0x7ff00000;
	if(hy>=0x7ff00000) return gA(x,x);	/* overflow  */
	if(hy<0x00100000) {		/* underflow */
	    y = gM(x,x);
	    if(y!=x) {		/* raise underflow flag */
		FD_HI(y) = hx; FD_LO(y) = lx;
		return y;
	    }
	}
	FD_HI(x) = hx; FD_LO(x) = lx;
	return x;
}
Exemple #3
0
double fd_remainder(double x, double p)	/* wrapper fd_remainder */
{
	int hx,hp;
	unsigned sx,lx,lp;
	double p_half;

	hx = FD_HI(x);		/* high word of x */
	lx = FD_LO(x);		/* low  word of x */
	hp = FD_HI(p);		/* high word of p */
	lp = FD_LO(p);		/* low  word of p */
	sx = hx&0x80000000;
	hp &= 0x7fffffff;
	hx &= 0x7fffffff;

    /* purge off fd_exception values */
	if((hp|lp)==0) return gD(gM(x,p),gM(x,p)); 	/* p = 0 */
	if((hx>=0x7ff00000)||			/* x not fd_finite */
	  ((hp>=0x7ff00000)&&			/* p is NaN */
	  (((hp-0x7ff00000)|lp)!=0)))
	    return gD(gM(x,p),gM(x,p));


	if (hp<=0x7fdfffff) x = fd_fmod(x,gA(p,p));	/* now x < 2p */
	if (((hx-hp)|(lx-lp))==0) return gM(zero,x);
	x  = fd_fabs(x);
	p  = fd_fabs(p);
	if (hp<0x00200000) {
	    if(gA(x,x) > p) {
		x = gS(x,p);
		if(gA(x,x) >= p) x = gS(x,p);
	    }
	} else {
	    p_half = gM(0.5,p);
	    if(x>p_half) {
		x = gS(x,p);
		if(x>=p_half) x = gS(x,p);
	    }
	}
	FD_HI(x) ^= sx;
	return x;
}
Exemple #4
0
double fd_y0(double x)		/* wrapper fd_y0 */
{
	double z, s,c,ss,cc,u,v;
	int hx,ix,lx;

        hx = FD_HI(x);
        ix = 0x7fffffff&hx;
        lx = FD_LO(x);
    /* Y0(NaN) is NaN, fd_y0(-inf) is Nan, fd_y0(inf) is 0  */
	if(ix>=0x7ff00000) return gD( one, gA(x, gM(x,x)));
        if((ix|lx)==0) return gD(-one, zero);
        if(hx<0) return gD(zero,zero);
        if(ix >= 0x40000000) {  /* |x| >= 2.0 */
        /* fd_y0(x) = fd_sqrt(2/(pi*x))*(p0(x)*fd_sin(x0)+q0(x)*fd_cos(x0))
         * where x0 = x-pi/4
         *      Better formula:
         *              fd_cos(x0) = fd_cos(x)fd_cos(pi/4)+fd_sin(x)fd_sin(pi/4)
         *                      =  1/fd_sqrt(2) * (fd_sin(x) + fd_cos(x))
         *              fd_sin(x0) = fd_sin(x)fd_cos(3pi/4)-fd_cos(x)fd_sin(3pi/4)
         *                      =  1/fd_sqrt(2) * (fd_sin(x) - fd_cos(x))
         * To avoid cancellation, use
         *              fd_sin(x) +- fd_cos(x) = -fd_cos(2x)/(fd_sin(x) -+ fd_cos(x))
         * to compute the worse one.
         */
                s = fd_sin(x);
                c = fd_cos(x);
                ss = gS(s,c);
                cc = gA(s,c);
	/*
	 * fd_j0(x) = 1/fd_sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / fd_sqrt(x)
	 * fd_y0(x) = 1/fd_sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / fd_sqrt(x)
	 */
                if(ix<0x7fe00000) {  /* make sure x+x not overflow */
                    z = -fd_cos(gA(x,x));
                    if (gM(s,c) < zero) cc = gD(z,ss);
                    else            ss = gD(z,cc);
                }
                if(ix>0x48000000) z = gD(gM(invsqrtpi,ss), gSqrt(x));
                else {
                    u = pzero(x); v = qzero(x);
                    z = gD(gM(invsqrtpi, gA(gM(u,ss), gM(v,cc))), gSqrt(x));
                }
                return z;
	}
	if(ix<=0x3e400000) {	/* x < 2**-27 */
	    return gA(u00, gM(tpi, fd_log(x)));
	}
	z = gM(x,x);
	u = gA(u00, gM(z,gA(u01, gM(z,gA(u02, gM(z,gA(u03, gM(z,gA(u04, gM(z,gA(u05, gM(z,u06))))))))))));
	v = gA(one, gM(z,gA(v01, gM(z,gA(v02, gM(z,gA(v03, gM(z,v04))))))));
	return(gD(u,v) + gM(tpi,gM(fd_j0(x), fd_log(x))));
}
Exemple #5
0
double fd_j0(double x)		/* wrapper fd_j0 */
{
	double z, s,c,ss,cc,r,u,v;
	int hx,ix;

	hx = FD_HI(x);
	ix = hx&0x7fffffff;
	if(ix>=0x7ff00000) return gD(one, gM(x,x));
	x = fd_fabs(x);
	if(ix >= 0x40000000) {	/* |x| >= 2.0 */
		s = fd_sin(x);
		c = fd_cos(x);
		ss = gS(s,c);
		cc = gA(s,c);
		if(ix<0x7fe00000) {  /* make sure x+x not overflow */
		    z = -fd_cos(gA(x,x));
		    if (gM(s,c) < zero) cc = gD(z,ss);
		    else 	    ss = gD(z,cc);
		}
	/*
	 * fd_j0(x) = 1/fd_sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / fd_sqrt(x)
	 * fd_y0(x) = 1/fd_sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / fd_sqrt(x)
	 */
		if(ix>0x48000000) z = gD(gM(invsqrtpi,cc),gSqrt(x));
		else {
		    u = pzero(x); v = qzero(x);
		    z = gD(gM(invsqrtpi, (gS(gM(u,cc), gM(v,ss)))), gSqrt(x));
		}
		return z;
	}
	if(ix<0x3f200000) {	/* |x| < 2**-13 */
	    if(huge+x>one) {	/* raise inexact if x != 0 */
	        if(ix<0x3e400000) return one;	/* |x|<2**-27 */
	        else 	      return gS(one, gM(gM(0.25,x),x));
	    }
	}
	z = gM(x,x);
	r = gM(z,gA(R02, gM(z,gA(R03, gM(z,gA(R04, gM(z,R05)))))));
	s = gA(one, gM(z,gA(S01, gM(z,gA(S02, gM(z,gA(S03, gM(z,S04))))))));
	if(ix < 0x3FF00000) {	/* |x| < 1.00 */
	    return gA(one, gM(z,gA(-0.25,gD(r,s))));
	} else {
	    u = gM(0.5,x);
	    return(gM(gA(one, u), gS(one, u)) + gM(z, gD(r,s)));
	}
}
Exemple #6
0
static double qzero(double x)
{
	const double *p,*q;
	double s,r,z;
	int ix;
	ix = 0x7fffffff&FD_HI(x);
	if(ix>=0x40200000)     {p = qR8; q= qS8;}
	else if(ix>=0x40122E8B){p = qR5; q= qS5;}
	else if(ix>=0x4006DB6D){p = qR3; q= qS3_;}
	else if(ix>=0x40000000){p = qR2; q= qS2_;}
	z = gD(one, gM(x,x));
	r = gA(p[0], gM(z,gA(p[1], gM(z,gA(p[2], gM(z,gA(p[3], gM(z,gA(p[4], gM(z,p[5]))))))))));
	s = gA(one , gM(z,gA(q[0], gM(z,gA(q[1], gM(z,gA(q[2], gM(z,gA(q[3], gM(z,gA(q[4], gM(z,q[5]))))))))))));
	return gD(gA(-.125, gD(r,s)), x);
}
Exemple #7
0
static double pzero(double x)
{
	const double *p,*q;
	double z,r,s;
	int ix;
	ix = 0x7fffffff&FD_HI(x);
	if(ix>=0x40200000)     {p = pR8; q= pS8;}
	else if(ix>=0x40122E8B){p = pR5; q= pS5_;}
	else if(ix>=0x4006DB6D){p = pR3; q= pS3_;}
	else if(ix>=0x40000000){p = pR2; q= pS2_;}
	z = gD(one, gM(x,x));
	r = gA(p[0], gM(z,gA(p[1], gM(z,gA(p[2], gM(z,gA(p[3], gM(z,gA(p[4], gM(z,p[5]))))))))));
	s = gA(one , gM(z,gA(q[0], gM(z,gA(q[1], gM(z,gA(q[2], gM(z,gA(q[3], gM(z,q[4]))))))))));
	return gA(one, gD(r,s));
}