diff --git a/src/scripts/pycompare.py b/src/scripts/pycompare.py
index 0ebeff4eaf0f19458a2a8478d9ba7e67ccf40532..546486a3c09e9848f15231326358498786ab315f 100755
--- a/src/scripts/pycompare.py
+++ b/src/scripts/pycompare.py
@@ -230,7 +230,7 @@ def compare_lines(f_line, c_line, config, line_num=0, num_len=4, log_file=None):
                 if (len(severities) > 0):
                     if (severities[-1] == 0):
                         log_line = (
-                            log_line + c_groups[-1] + c_line[c_ends[-1]:len(c_line) - 2]
+                            log_line + c_groups[-1] + c_line[c_ends[-1]:len(c_line) - 1]
                         )
                     elif (severities[-1] == 1):
                         log_line = (
@@ -291,50 +291,73 @@ def compare_lines(f_line, c_line, config, line_num=0, num_len=4, log_file=None):
 #  \returns result: `array(int)` An array of severity codes ordered as the
 #  input numeric values.
 def mismatch_severities(str_f_values, str_c_values, config):
-    result = [0 for ri in range(len(str_f_values))]
-    for i in range(len(str_f_values)):
-        if (str_f_values[i] != str_c_values[i]):
+    result = []
+    if len(str_f_values) == len(str_c_values):
+        result = [0 for ri in range(len(str_f_values))]
+        f_values = []
+        c_values = []
+        # Convert numeric strings to numbers
+        for i in range(len(str_f_values)):
             # Add the exponent marker if it is missing
             temp_str_value = str_f_values[i][1:]
             split_temp = temp_str_value.split('-')
             if len(split_temp) > 1:
                 if (split_temp[0][-1] != 'E'):
                     str_f_values[i] = str_f_values[i][0] + split_temp[0] + "E-" + split_temp[1]
+            f_values.append(float(str_f_values[i]))
             temp_str_value = str_c_values[i][1:]
             split_temp = temp_str_value.split('-')
             if len(split_temp) > 1:
                 if (split_temp[0][-1] != 'E'):
                     str_c_values[i] = str_c_values[i][0] + split_temp[0] + "E-" + split_temp[1]
+            c_values.append(float(str_c_values[i]))
             # End of missing exponent marker correction
-            f_values = [float(str_f_values[j]) for j in range(len(str_f_values))]
-            c_values = [float(str_c_values[j]) for j in range(len(str_c_values))]
-            if (len(f_values) != len(c_values)): return []
-            f_log_values = [0.0 for j in range(len(f_values))]
-            c_log_values = [0.0 for j in range(len(c_values))]
-            max_f_log = -1.0e12
-            max_c_log = -1.0e12
-            min_f_log = 1.0e12
-            min_c_log = 1.0e12
-            for j in range(len(f_values)) :
-                if f_values[j] < 0.0: f_values[j] *= -1.0
-                if c_values[j] < 0.0: c_values[j] *= -1.0
-                f_log_values[j] = log10(f_values[j]) if f_values[j] > 0.0 else -999
-                c_log_values[j] = log10(c_values[j]) if c_values[j] > 0.0 else -999
-                if (f_log_values[j] > max_f_log): max_f_log = f_log_values[j]
-                if (c_log_values[j] > max_c_log): max_c_log = c_log_values[j]
-                if (f_log_values[j] < min_f_log): min_f_log = f_log_values[j]
-                if (c_log_values[j] < min_c_log): min_c_log = c_log_values[j]
-            if (c_log_values[i] < max_c_log - 5.0 and f_log_values[i] < max_f_log - 5.0):
-                result[i] = 1
-            else:
-                warning_scale = 10.0**(int(max_f_log - f_log_values[i]))
-                difference = c_values[i] - f_values[i]
-                fractional = 1.0
+        # End string to number conversion
+        # Evaluate the maximum scale
+        max_f_log = -1.0e12
+        max_c_log = -1.0e12
+        for si in range(len(f_values)):
+            if (f_values[i] != 0):
+                sign = 1.0 if f_values[i] > 0.0 else -1.0
+                log_f_value = log10(sign * f_values[i])
+                if (log_f_value > max_f_log): max_f_log = log_f_value
+            if (c_values[i] != 0):
+                sign = 1.0 if c_values[i] > 0.0 else -1.0
+                log_c_value = log10(sign * c_values[i])
+                if (log_c_value > max_c_log): max_c_log = log_c_value
+        if (max_f_log == -1.0e12): max_f_log = 0.0
+        if (max_c_log == -1.0e12): max_c_log = 0.0
+        # End of maximum scale evaluation
+        # Compare the numbers
+        for i in range(len(f_values)):
+            if (f_values[i] != c_values[i]):
                 if (f_values[i] != 0.0):
-                    fractional = difference / f_values[i]
-                if (fractional < 0.0): fractional *= -1.0
-                if (fractional < warning_scale * config['warning_threshold']): result[i] = 2
-                else: result[i] = 3
+                    sign = 1.0 if f_values[i] > 0.0 else -1.0
+                    log_f_value = log10(sign * f_values[i])
+                    if (log_f_value > max_f_log - 5.0):
+                        scale = 10.0**(log_f_value - max_f_log)
+                        fractional = scale * (f_values[i] - c_values[i]) / f_values[i]
+                        if (fractional < 0.0): fractional *= -1.0
+                        if (fractional <= config['warning_threshold']):
+                            result[i] = 2
+                        else:
+                            result[i] = 3
+                    else:
+                        result[i] = 1
+                else: # f_values[i] == 0 and c_values[i] != 0
+                    sign = 1.0 if c_values[i] > 0.0 else -1.0
+                    log_c_value = log10(sign * c_values[i])
+                    if (log_c_value > max_c_log - 5.0):
+                        scale = 10.0**(log_c_value - max_c_log)
+                        fractional = scale * (c_values[i] - f_values[i]) / c_values[i]
+                        if (fractional < 0.0): fractional *= -1.0
+                        if (fractional <= config['warning_threshold']):
+                            result[i] = 2
+                        else:
+                            result[i] = 3
+                    else:
+                        result[i] = 1
+        # End number comparison
     return result
     
 ## \brief Parse the command line arguments.