
/** Gause-Seidel Subnormal 
  * Microbenchmark 
  * Java Version
  */

class Bench {
public static void main(String[] args) {
  System.out.println(
  "Running Gauss-Seidel Micro-bench");

  int SIZE = 100000;
  int ITER = 1000;
  int i, j;
  double tstart, tslow, tfast;
  double []a= new double[SIZE];

  /* Initialize with 0's */
  for (i = 1; i<SIZE; i++) 
  	{ a[i] = 0.0; }
  a[0] = 1.0;
  tstart = myTimer();
  for (j=0; j<ITER; j++){
  for (i = 2; i<SIZE; i++){
     a[i] = (a[i] + a[i-1] + a[i-2])*
     (1.0/3.0); } }
  tslow = myTimer()-tstart;
 
  /* Initialize with normals */
  for (i = 1; i<SIZE; i++) 
  	{ a[i] = 1.0E-50; }
  a[0] = 1.0;
  tstart = myTimer();
  for (j=0; j<ITER; j++){
  for (i = 2; i<SIZE; i++){
     a[i] = (a[i] + a[i-1] + a[i-2])*
     (1.0/3.0); } }
  tfast = myTimer()-tstart;
 
  System.out.println(
  		"time slow: " 
		+ tslow);
  System.out.println(
  		"fast: " 
		+ tfast);
  System.out.println(
  		"slowdown=" 
		+ tslow/tfast);
}

static double myTimer(){
  return System.currentTimeMillis()
    / 1000.0;
}
}
 
