TSIL_COMPLEX TSIL_Trilogunitdisk (TSIL_COMPLEX z) { TSIL_COMPLEX result; TSIL_REAL rez = TSIL_CREAL (z); TSIL_REAL absz = TSIL_CABS (z); TSIL_REAL absimz = TSIL_FABS (TSIL_CIMAG (z)); if (TSIL_CABS(z - 1.0L) < 2.0L * TSIL_TOL) result = cZeta3; else if (TSIL_CABS(z) < 2.0L * TSIL_TOL) result = 0.0L; else if (TSIL_CABS(TSIL_CLOG(z)) < trilog_CLZseries_radius) result = TSIL_TrilogCLZseries (z); else if (absz <= trilog_powerseries_radius) result = TSIL_Trilogseries (z); else if (rez <= 0.0L) result = TSIL_TrilogregionA (z); else if (rez <= absimz) result = TSIL_TrilogregionB (z); else { TSIL_Warn("TSIL_Trilogunitdisk", "trilog function yielding undefined result."); result = TSIL_Infinity; } return result; }
TSIL_COMPLEX TSIL_Trilogoutofunitdisk (TSIL_COMPLEX z) { TSIL_COMPLEX result; TSIL_COMPLEX logminusz = TSIL_CLOG(-z); if (TSIL_CREAL(z) > 1.0L && TSIL_CIMAG((complex double) z) == 0.0) logminusz = I * PI_longdouble + TSIL_CLOG(TSIL_CREAL (z)); result = TSIL_Trilogunitdisk (1.0L/z) - logminusz*(cZeta2 + logminusz*logminusz/6.0L); return result; }
TSIL_COMPLEX TSIL_B (TSIL_REAL X, TSIL_REAL Y, TSIL_COMPLEX S, TSIL_REAL QQ) { TSIL_REAL temp; TSIL_COMPLEX sqDeltaSXY, lnbarX, lnbarY; if (TSIL_FABS (X) < TSIL_FABS (Y)) {temp = Y; Y = X; X = temp;} if (TSIL_FABS (X) < TSIL_TOL) return TSIL_B00(S,QQ); if (TSIL_FABS (Y) < TSIL_TOL) return TSIL_B0x(X,S,QQ); if (TSIL_CABS (S) < TSIL_TOL) { if (TSIL_FABS (1.0L - Y/X) > 0.0L) return (1.0L + (Y*TSIL_LOG(Y/QQ) - X*TSIL_LOG(X/QQ))/(X-Y)); else return (-TSIL_LOG (X/QQ)); } S = TSIL_AddIeps(S); sqDeltaSXY = TSIL_CSQRT(TSIL_Delta(S, X, Y)); lnbarX = TSIL_LOG (X/QQ); lnbarY = TSIL_LOG (Y/QQ); /* Following avoids roundoff error for very negative s. */ if ((TSIL_CREAL(S) < -10.0L*(X+Y)) && (TSIL_CIMAG(S) < TSIL_TOL)) { return (2.0L - 0.5L * (lnbarX + lnbarY) + (sqDeltaSXY * TSIL_CLOG(0.5L*(X + Y - S + sqDeltaSXY)/Y) + 0.5L * (Y - X - sqDeltaSXY) * (lnbarX - lnbarY))/S); } return (2.0L - 0.5L * (lnbarX + lnbarY) + (-sqDeltaSXY * TSIL_CLOG(0.5L*(X + Y - S - sqDeltaSXY)/X) + 0.5L * (Y - X - sqDeltaSXY) * (lnbarX - lnbarY))/S); }
void TSIL_Compare (const char *name, TSIL_COMPLEX actual, TSIL_COMPLEX computed, TSIL_REAL allow_pass, TSIL_REAL allow_warn, int *result) { TSIL_REAL a_re, a_im, c_re, c_im, magnitude, err; int foo; a_re = TSIL_CREAL (actual); a_im = TSIL_CIMAG (actual); c_re = TSIL_CREAL (computed); c_im = TSIL_CIMAG (computed); magnitude = TSIL_CABS (actual) + TSIL_TOL; /* DGR */ if (TSIL_IsInfinite (actual)) { if (TSIL_IsInfinite (computed)) foo = PASS * PASS; else foo = FAIL; } else { /* Check Real part */ err = TSIL_FABS (a_re - c_re) / magnitude; if (err < allow_pass) foo = PASS; else if (err < allow_warn) foo = WARN; else { /* printf("\nFailure in re part: err = %Le\n", (long double) err); */ foo = FAIL; } /* Check Imaginary part */ err = TSIL_FABS (a_im - c_im) / magnitude; if (err < allow_pass) foo *= PASS; else if (err < allow_warn) foo *= WARN; else { /* printf("\nFailure in im part: err = %Le\n", (long double) err); */ foo *= FAIL; } } if (foo == 4) *result = PASS; else if (foo == 1 || foo == 2) { *result = WARN; printf ("\nWARN\n"); printf ("Expected for %s: ", name); TSIL_cprintfM (actual); printf ("\n"); printf ("Obtained for %s: ", name); TSIL_cprintfM (computed); printf ("\n"); } else if (foo == 0) { *result = FAIL; printf ("\nFAIL\n"); printf ("Expected for %s: ", name); TSIL_cprintfM (actual); printf ("\n"); printf ("Obtained for %s: ", name); TSIL_cprintfM (computed); printf ("\n"); } else printf ("NOPE! Can't EVER get here in TSIL_Compare!!!\n"); return; }