_UNRAVELING OPTIMIZATION IN MICROSOFT C 6.0_ by Bruce D. Schatzman [LISTING ONE] #include long area[3]; void compute_areas(void); main() { int i; extern long area[3]; compute_areas(); for(i = 0; i <= 2; i++) printf("The approximate area of function %d is %ld\n", i, area[i]); } void compute_areas(void) { long temp, y0[100], y1[100], y2[100]; extern long area[3]; int i, k, a, b, c, d, n, m, j; a = 2; b = 5; c = 1; d = 3; area[0] = area[1] = area[2] = temp = 0; /* compute 100 initial y values for all functions and approximate area under curves. Do this 100 times. */ for (i = 0; i <= 99; i++) { for (j = 0; j <= 99; j++) { n = j-1; m = j+1; y0[j] = a*j*n + 48*j - (c+d); y1[j] = d*(j+10) + a*b; y2[j] = c*j*m + 73*j*j + n; } } /* add a*b+c+d to all y values. Do this 100 times. */ for (i = 0; i <= 99; i++) { for (j = 0; j <= 99; j++) { y0[j] += a*b+c+d; y1[j] += a*b+c+d; y2[j] += a*b+c+d; } } /* bubblesort each array */ for (i = 0; i <= 99; i++) { for (k = 99; k >= 1; k--) { if (y0[k-1] > y0[k]) { temp = y0[k]; y0[k] = y0[k-1]; y0[k-1] = temp; } if (y1[k-1] > y1[k]) { temp = y1[k]; y1[k] = y1[k-1]; Š y1[k-1] = temp; } if (y2[k-1] > y2[k]) { temp = y2[k]; y2[k] = y2[k-1]; y2[k-1] = temp; } } } /* now compute areas */ for (j = 0; j <= 99; j++) { area[0] += y0[j]; area[1] += y1[j]; area[2] += y2[j]; } return; } [LISTING TWO] #include long area[3]; void compute_areas(void); main() { int i; extern long area[3]; compute_areas(); for(i = 0; i <= 2; i++) printf("The approximate area of function %d is %ld\n", i, area[i]); } void compute_areas(void) { long temp, y0[100], y1[100], y2[100]; extern long area[3]; int i, k, a, b, c, d, n, m, j; a = 2; b = 5; c = 1; d = 3; area[0] = area[1] = area[2] = temp = 0; /* compute 100 initial y values for all functions and approximate area under curves. Do this 100 times. */ for (i = 0; i <= 99; i++) { for (j = 0; j <= 99; j++) { n = j-1; m = j+1; y0[j] = a*j*n + 48*j - 4; y1[j] = d*j +40; y2[j] = c*j*j*m - 73*j*j; } } /* add 14 to all y values. Do this 100 times. */ Š for (i = 0; i <= 99; i++) { for (j = 0; j <= 99; j++) { y0[j] += 14; y1[j] += 14; y2[j] += 14; } } /* bubblesort each array */ for (i = 0; i <= 99; i++) { for (k = 99; k >= 1; k--) { if (y0[k-1] > y0[k]) { temp = y0[k]; y0[k] = y0[k-1]; y0[k-1] = temp; } if (y1[k-1] > y1[k]) { temp = y1[k]; y1[k] = y1[k-1]; y1[k-1] = temp; } if (y2[k-1] > y2[k]) { temp = y2[k]; y2[k] = y2[k-1]; y2[k-1] = temp; } } } /* now compute areas */ for (j = 0; j <= 99; j++) { area[0] += y0[j]; area[1] += y1[j]; area[2] += y2[j]; } return; } [LISTING THREE] #include long area[3]; void compute_areas(void); main() { int i; extern long area[3]; compute_areas(); for(i = 0; i <= 2; i++) printf("The approximate area of function %d is %ld\n", i, area[i]); } void compute_areas(void) Š{ long temp, y0[100], y1[100], y2[100]; extern long area[3]; int i, k, j; area[0] = area[1] = area[2] = temp = 0; /* compute 100 initial y values for all functions and approximate area under curves. Do this 100 times. */ for (i = 0; i <= 99; i++) { for (j = 0; j <= 99; j++) { y0[j] = 2*j*j - 50*j +10; y1[j] = 3*j + 54; y2[j] = j*j*j - 72*j + 14; } } /* bubblesort each array */ for (i = 0; i <= 99; i++) { for (k = 99; k >= 1; k--) { if (y0[k-1] > y0[k]) { temp = y0[k]; y0[k] = y0[k-1]; y0[k-1] = temp; } if (y1[k-1] > y1[k]) { temp = y1[k]; y1[k] = y1[k-1]; y1[k-1] = temp; } if (y2[k-1] > y2[k]) { temp = y2[k]; y2[k] = y2[k-1]; y2[k-1] = temp; } } } /* now compute areas */ for (j = 0; j <= 99; j++) { area[0] += y0[j]; area[1] += y1[j]; area[2] += y2[j]; } return; } [Example 1. ] void main(void) { int x, y, *p; p = &x; x = 1; y = 2; z = 6 for(k = 1; k <= 100; k++) { Š k += x + y + z; *p = k; } )