////////////////////////////////////////////////////////////////////// // 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; }
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; }
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; }
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)))); }
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))); } }
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); }
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)); }