void ei_outsb(u32 addr, const void *vbuf, int len) { NE2000_BYTE *rp, val; u8 *buf; buf = (u8 *) vbuf; rp = (NE2000_BYTE *) NE_DATA_PTR(addr); for (; (len > 0); len--) { val = *buf++; *rp = RSWAP(val); } }
static double COMABS(double ar, double ai) { if (ar == 0.0 && ai == 0.0) return 0.0; ar = fabs(ar); ai = fabs(ai); if (ai > ar) RSWAP(&ai, &ar); if (ai == 0.0) return ar; else return ar * sqrt(1.0 + ai / ar * ai / ar); }
void eig_balance(double *A, size_t n, size_t *low, size_t *high, double *scal) { double b2, r, c, f, g, s, BASIS; size_t m, k, j, i; int iter; BASIS = 2; b2 = BASIS * BASIS; m = 0; k = n - 1; iter = 1; while (iter == 1) { iter = 0; for (j = k + 1; (j--) > 0;) { r = 0; for (i = 0; i <= k; i++) if (i != j) r += fabs(A[j*n + i]); if (r == 0) { iter = 1; scal[k] = j; if (j != k) { for (i = 0; i <= k; i++) RSWAP(&(A[i*n + j]), &(A[i*n + k])); for (i = m; i < n; i++) RSWAP(&(A[j*n + i]), &(A[k*n + i])); } k--; } } } iter = 1; while (iter == 1) { iter = 0; for (j = m; j <= k; j++) { c = 0.0; for (i = m; i <= k; i++) if (i != j) c += fabs(A[i*n + j]); if (c == 0.0) { iter = 1; scal[m] = j; if (j != m) { for (i = 0; i <= k; i++) RSWAP(&(A[i*n + j]), &(A[i*n + m])); for (i = m; i < n; i++) RSWAP(&(A[j*n + i]), &(A[m*n + i])); } m++; } } } (*low) = m; (*high) = k; for (i = m; i <= k; i++) scal[i] = 1.0; iter = 1; while (iter == 1) { iter = 0; for (i = m; i <= k; i++) { c = r = 0.0; for (j = m; j <= k; j++) { if (j != i) { c += fabs(A[j*n + i]); r += fabs(A[i*n + j]); } } g = r / BASIS; f = 1.0; s = c + r; while (c < g) { f *= BASIS; /* f = r * BASIS; */ c *= b2; } g = r * BASIS; while (c >= g) { f /= BASIS; c /= b2; } if ((c + r) / f < 0.95 * s) { iter = 1; g = 1.0 / f; scal[i] *= f; for (j = m; j < n; j++) A[i*n + j] *= g; for (j = 0; j <= k; j++) A[j*n + i] *= f; } } } }