// RETURNS A SCALE FACTOR TO MULTIPLY THE COEFFICIENTS OF THE POLYNOMIAL. // THE SCALING IS DONE TO AVOID OVERFLOW AND TO AVOID UNDETECTED UNDERFLOW // INTERFERING WITH THE CONVERGENCE CRITERION. THE FACTOR IS A POWER OF THE //int BASE. // PT - MODULUS OF COEFFICIENTS OF P // ETA, INFIN, SMALNO, BASE - CONSTANTS DESCRIBING THE FLOATING POINT ARITHMETIC. // static void scale(const int deg, xcomplex* P) { int hi, lo, max, min, x, sc; // Find largest and smallest moduli of coefficients hi = (int)(xdata.MAX_EXP / 2.0); lo = (int)(xdata.MIN_EXP - xbits(P[0])); max = xlogb(P[0]); // leading coefficient does not vanish! min = xlogb(P[0]); for(int i = 0; i <= deg; i++) { if (P[i] != xdata.ZERO){ x = xlogb(P[i]); if(x > max) max = x; if(x < min) min = x; } } // Scale only if there are very large or very small components if(min >= lo && max <= hi) return; x = lo - min; if(x <= 0) sc = -(max+min) / 2; else { sc = x; if(xdata.MAX_EXP - sc > max) sc = 0; } // Scale the polynomial for(int i = 0; i<= deg; i++){ xscalbln(&P[i],sc); } }
movword(void) { int w; Tchar i, *wp; int savwch, hys; over = 0; wp = wordp; if (!nwd) { while (cbits(*wp++) == ' ') { wch--; wne -= sps; } wp--; } if (wne > nel && !hyoff && hyf && (!nwd || nel > 3 * sps) && (!(hyf & 02) || (findt1() > lss))) hyphen(wp); savwch = wch; hyp = hyptr; nhyp = 0; while (*hyp && *hyp <= wp) hyp++; while (wch) { if (hyoff != 1 && *hyp == wp) { hyp++; if (!wdstart || (wp > wdstart + 1 && wp < wdend && (!(hyf & 04) || wp < wdend - 1) && /* 04 => last 2 */ (!(hyf & 010) || wp > wdstart + 2))) { /* 010 => 1st 2 */ nhyp++; storeline((Tchar)IMP, 0); } } i = *wp++; w = width(i); wne -= w; wch--; storeline(i, w); } if (nel >= 0) { nwd++; return(0); /* line didn't fill up */ } if (TROFF) xbits((Tchar)HYPHEN, 1); hys = width((Tchar)HYPHEN); m1: if (!nhyp) { if (!nwd) goto m3; if (wch == savwch) goto m4; } if (*--linep != IMP) goto m5; if (!(--nhyp)) if (!nwd) goto m2; if (nel < hys) { nc--; goto m1; } m2: if ((i = cbits(*(linep - 1))) != '-' && i != EMDASH) { *linep = (*(linep - 1) & SFMASK) | HYPHEN; w = width(*linep); nel -= w; ne += w; linep++; } m3: nwd++; m4: wordp = wp; return(1); /* line filled up */ m5: nc--; w = width(*linep); ne -= w; nel += w; wne += w; wch++; wp--; goto m1; }