diff --git a/codes/2mm/2mm.c b/codes/2mm/2mm.c
index 7c78512bc0e4c2d4f6df940a22aa3de928358c0f..db4bf9a67491db079e5afd942f738dc61e28df3d 100644
--- a/codes/2mm/2mm.c
+++ b/codes/2mm/2mm.c
@@ -77,15 +77,18 @@ void calc_error(int ni, int nl,
 		 DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
 {
     int i;
+    int n = ni*nl;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(D[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nl; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nl;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/3mm/3mm.c b/codes/3mm/3mm.c
index bbf57202e2507a66f91404f3bc47007ea0467f04..0b2295357c93d275bb656754acabcaa34f27b67d 100644
--- a/codes/3mm/3mm.c
+++ b/codes/3mm/3mm.c
@@ -73,15 +73,18 @@ void calc_error(int ni, int nl,
 		 DATA_TYPE POLYBENCH_2D(D,NI,NL,ni,nl))
 {
     int i;
+    int n = ni*nl;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(D[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nl; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nl;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/adi/adi.c b/codes/adi/adi.c
index 8bd7b05c7f0bc9548c4fb42cf155f6b784bd8375..08f3e2eda909ecb1394214c128dd4126a2c95aa5 100644
--- a/codes/adi/adi.c
+++ b/codes/adi/adi.c
@@ -64,15 +64,18 @@ void calc_error (int n,
 		 DATA_TYPE POLYBENCH_2D(u,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(u[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/covariance/covariance.c b/codes/covariance/covariance.c
index 3c5a7fe3d24074fa53eda44f778be98bd78d46b9..8f8c98b960de6456486a4178cdb2e193d015d665 100644
--- a/codes/covariance/covariance.c
+++ b/codes/covariance/covariance.c
@@ -65,15 +65,18 @@ void calc_error(int m,
 		 DATA_TYPE POLYBENCH_2D(cov,M,M,m,m))
 {
     int i, j;
+    int n = m*m;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(cov[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*m; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*m;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/deriche/deriche.c b/codes/deriche/deriche.c
index 29c2270a5445395b84329ac938dc74530ba55598..0c0be9bc4a33c9390129ea805d5ac2ea73dc78af 100644
--- a/codes/deriche/deriche.c
+++ b/codes/deriche/deriche.c
@@ -66,15 +66,18 @@ void calc_error(int w, int h,
 		 DATA_TYPE POLYBENCH_2D(imgOut,W,H,w,h))
 {
     int i;
+    int n = w*h;
     double err = 0;
     float *accurate = &_binary_data_bin_start;
     float *test = &(imgOut[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < w*h; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= w*h;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/doitgen/doitgen.c b/codes/doitgen/doitgen.c
index 392b054a86f9b1f4c7389170d1137e84d8484f5a..8cc474652598b27cd10d396e41dc3c226ef0e099 100644
--- a/codes/doitgen/doitgen.c
+++ b/codes/doitgen/doitgen.c
@@ -67,15 +67,18 @@ void calc_error(int nr, int nq, int np,
 		 DATA_TYPE POLYBENCH_3D(A,NR,NQ,NP,nr,nq,np))
 {
     int i;
+    int n = nr*nq*np;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < nr*nq*np; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= nr*nq*np;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/fdtd-2d/fdtd-2d.c b/codes/fdtd-2d/fdtd-2d.c
index 8a7ffc4f99b2dce59cff42c95d4553fa1fff33d7..ba3e2da70757214bd612b9b0f5f127200551f06d 100644
--- a/codes/fdtd-2d/fdtd-2d.c
+++ b/codes/fdtd-2d/fdtd-2d.c
@@ -95,33 +95,40 @@ void calc_error(int nx,
 		 DATA_TYPE POLYBENCH_2D(hz,NX,NY,nx,ny))
 {
     int i;
+    int n = nx*ny;
     double err = 0;
 
     {
         double *accurate = &_binary_data_ex_bin_start;
         double *test = &(ex[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
     {
         double *accurate = &_binary_data_ey_bin_start;
         double *test = &(ey[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
     {
         double *accurate = &_binary_data_hz_bin_start;
         double *test = &(hz[0][0]);
 
-        /* calculate the mean squared error */
-        for(i = 0; i < nx*ny; i++) {
-            err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        for(i = 0; i < n; i++) {
+            double e = fabs((accurate[i] - test[i])/accurate[i]);
+            if(e > 1)
+                e = 1;
+            err += e;
         }
     }
 
diff --git a/codes/floyd-warshall/floyd-warshall.c b/codes/floyd-warshall/floyd-warshall.c
index ecd162666f1cd528da881756fc2c9888ba9e95d0..e8138c820b9b019ba2584b9892532926cf677cfb 100644
--- a/codes/floyd-warshall/floyd-warshall.c
+++ b/codes/floyd-warshall/floyd-warshall.c
@@ -64,15 +64,20 @@ static
 void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(path,N,N,n,n))
 {
-  double err = 0;
-  int *accurate = &_binary_data_bin_start;
-  int *test = &(path[0][0]);
-
-  for (int i = 0; i < n*n; i++) {
-      err += (accurate[i] - test[i]) * (accurate[i] - test[i]);
-  }
-  err /= n*n;
-  printf("error: %f\n", err);
+    int i;
+    int n = n*n;
+    double err = 0;
+    int *accurate = &_binary_data_bin_start;
+    int *test = &(path[0][0]);
+
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
+    }
+    err /= n;
+    printf("error: %f\n", err);
 }
 
 
@@ -85,7 +90,7 @@ void kernel_floyd_warshall(int n,
   int i, j, k;
 
 #pragma scop
-  for (k = 0; k < _PB_N; k++)
+  for (k = 0; k < n; k++)
     {
       for(i = 0; i < _PB_N; i++)
 	for (j = 0; j < _PB_N; j++)
diff --git a/codes/gemm/gemm.c b/codes/gemm/gemm.c
index 37f8fd86126ae24664fb4d4f4867c08219ed9f44..b7a73ef5845fa48b7d0b6c248afd7cd92a14a22c 100644
--- a/codes/gemm/gemm.c
+++ b/codes/gemm/gemm.c
@@ -73,15 +73,18 @@ void calc_error(int ni, int nj,
 		 DATA_TYPE POLYBENCH_2D(C,NI,NJ,ni,nj))
 {
     int i;
+    int n = ni*nj;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < ni*nj; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= ni*nj;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/gemver/gemver.c b/codes/gemver/gemver.c
index 8c300358add26076d7c0774ceacf4bc255903277..ad8ec47a311c2cea872e7eba4b96ae770deb8e9c 100644
--- a/codes/gemver/gemver.c
+++ b/codes/gemver/gemver.c
@@ -89,9 +89,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(w[0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/gesummv/gesummv.c b/codes/gesummv/gesummv.c
index fe523fed082fa48b6c9a4b6887adcdad619fb539..b21dbe989baab974ee969559359f30d2e5e4c1c3 100644
--- a/codes/gesummv/gesummv.c
+++ b/codes/gesummv/gesummv.c
@@ -76,9 +76,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(y[0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/heat-3d/heat-3d.c b/codes/heat-3d/heat-3d.c
index f171a17d21335e01b7ba126aaeab325539611ee7..85914fd37404fad95a75243f852ce2b1a8d75434 100644
--- a/codes/heat-3d/heat-3d.c
+++ b/codes/heat-3d/heat-3d.c
@@ -65,15 +65,19 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_3D(A,N,N,N,n,n,n))
 {
     int i;
+    int n = n*n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0][0]);
 
     /* calculate the mean squared error */
-    for(i = 0; i < n*n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/jacobi-1d/jacobi-1d.c b/codes/jacobi-1d/jacobi-1d.c
index 6cd537c4969ed043120550cb4f230b2214a0d00d..c77e4e1c516a85da96b1c570a01d0dd053ad5224 100644
--- a/codes/jacobi-1d/jacobi-1d.c
+++ b/codes/jacobi-1d/jacobi-1d.c
@@ -69,9 +69,11 @@ void calc_error(int n,
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0]);
 
-    /* calculate the mean squared error */
     for(i = 0; i < n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
     err /= n;
     printf("error: %f\n", err);
diff --git a/codes/jacobi-2d/jacobi-2d.c b/codes/jacobi-2d/jacobi-2d.c
index 5dc7edf694f6fb2cccae428df63915d70fb9a313..643c6c6af34aa471fa91c89ef8dbf4a370ebb980 100644
--- a/codes/jacobi-2d/jacobi-2d.c
+++ b/codes/jacobi-2d/jacobi-2d.c
@@ -66,15 +66,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/seidel-2d/seidel-2d.c b/codes/seidel-2d/seidel-2d.c
index 2debc95bb00cde1b69e648f5633865b56949ba04..0d6ba059186e92d1e222ecb77f55f0d8583b7ce5 100644
--- a/codes/seidel-2d/seidel-2d.c
+++ b/codes/seidel-2d/seidel-2d.c
@@ -62,15 +62,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(A,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(A[0][0]);
 
-    /* calculate the mean squared error */
-    for(i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/symm/symm.c b/codes/symm/symm.c
index ea286adaa86fe2d607c341d36e63b6d1b94e567f..f167ef9e495e68a1f2c4e8065e1ae1abcbb6e7a1 100644
--- a/codes/symm/symm.c
+++ b/codes/symm/symm.c
@@ -75,15 +75,18 @@ void calc_error(int m, int n,
 		 DATA_TYPE POLYBENCH_2D(C,M,N,m,n))
 {
     int i, j;
+    int n = m*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/syr2k/syr2k.c b/codes/syr2k/syr2k.c
index 0647acc03f80c5e221542e083205f184bcdf0144..60438f37402dd703e43d785cfe076523e926216a 100644
--- a/codes/syr2k/syr2k.c
+++ b/codes/syr2k/syr2k.c
@@ -73,15 +73,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/syrk/syrk.c b/codes/syrk/syrk.c
index 1db7bc18e1684fc6600038052e2b8ff258330012..3c95aa2ab497a2bb54b0640982778b13676702d8 100644
--- a/codes/syrk/syrk.c
+++ b/codes/syrk/syrk.c
@@ -69,15 +69,18 @@ void calc_error(int n,
 		 DATA_TYPE POLYBENCH_2D(C,N,N,n,n))
 {
     int i;
+    int n = n*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(C[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < n*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= n*n;
+    err /= n;
     printf("error: %f\n", err);
 }
 
diff --git a/codes/trmm/trmm.c b/codes/trmm/trmm.c
index 062cf1e3087bb43128bd8f0571cd6635e262565d..c1d287f013508884ce2d39038e358087e2e3b782 100644
--- a/codes/trmm/trmm.c
+++ b/codes/trmm/trmm.c
@@ -71,15 +71,18 @@ void calc_error(int m, int n,
 		 DATA_TYPE POLYBENCH_2D(B,M,N,m,n))
 {
     int i;
+    int n = m*n;
     double err = 0;
     double *accurate = &_binary_data_bin_start;
     double *test = &(B[0][0]);
 
-    /* calculate the mean squared error */
-    for (i = 0; i < m*n; i++) {
-        err += (accurate[i] - test[i])*(accurate[i] - test[i]);
+    for(i = 0; i < n; i++) {
+        double e = fabs((accurate[i] - test[i])/accurate[i]);
+        if(e > 1)
+            e = 1;
+        err += e;
     }
-    err /= m*n;
+    err /= n;
     printf("error: %f\n", err);
 }