From 5f3a7254c11733038f595f4af4b0ecbbdac2ab2b Mon Sep 17 00:00:00 2001 From: Peter Cao Date: Fri, 11 Sep 2009 15:09:34 -0500 Subject: [svn-r17466] " Use strict equality as default " Use "--use-system-epsilon" for system EPSILON " Use "-p" or "-d" for whatever user's choice of epsilon " Use "-p 0" or "-d 0" for strict equality (same as default) --- tools/h5diff/h5diff_common.c | 46 ++++++++++++++------- tools/h5diff/testfiles/h5diff_10.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_600.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_603.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_604.txt | 65 +----------------------------- tools/h5diff/testfiles/h5diff_605.txt | 65 +----------------------------- tools/h5diff/testfiles/h5diff_606.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_612.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_613.txt | 65 +----------------------------- tools/h5diff/testfiles/h5diff_614.txt | 65 +----------------------------- tools/h5diff/testfiles/h5diff_615.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_621.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_622.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_623.txt | 17 ++++---- tools/h5diff/testfiles/h5diff_624.txt | 17 ++++---- tools/h5diff/testh5diff.sh | 6 +-- tools/lib/h5diff.h | 31 +++++++------- tools/lib/h5diff_array.c | 76 ++++++++++++----------------------- 18 files changed, 185 insertions(+), 404 deletions(-) diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c index 8e7b181..3403935 100644 --- a/tools/h5diff/h5diff_common.c +++ b/tools/h5diff/h5diff_common.c @@ -43,6 +43,7 @@ static struct long_options l_opts[] = { { "relative", require_arg, 'p' }, { "nan", no_arg, 'N' }, { "compare", no_arg, 'c' }, + { "use-system-epsilon", no_arg, 'e' }, { NULL, 0, '\0' } }; @@ -109,6 +110,11 @@ void parse_command_line(int argc, h5diff_exit(EXIT_FAILURE); } options->delta = atof( opt_arg ); + + /* -d 0 is the same as default */ + if (options->delta == 0) + options->d=0; + break; case 'p': @@ -121,6 +127,11 @@ void parse_command_line(int argc, h5diff_exit(EXIT_FAILURE); } options->percent = atof( opt_arg ); + + /* -p 0 is the same as default */ + if (options->percent == 0) + options->p = 0; + break; case 'n': @@ -142,9 +153,16 @@ void parse_command_line(int argc, case 'c': options->m_list_not_cmp = 1; break; + case 'e': + options->use_system_epsilon = 1; + break; } } + /* if use system epsilon, unset -p and -d option */ + if (options->use_system_epsilon) + options->d = options->p = 0; + /* check for file names to be processed */ if (argc <= opt_ind || argv[ opt_ind + 1 ] == NULL) { @@ -277,7 +295,7 @@ check_p_input( const char *str ) return -1; x=atof(str); - if (x<=0) + if (x<0) return -1; return 1; @@ -311,7 +329,7 @@ check_d_input( const char *str ) return -1; x=atof(str); - if (x <=0) + if (x <0) return -1; return 1; @@ -344,18 +362,18 @@ void usage(void) printf(" -q, --quiet Quiet mode. Do not do output\n"); printf(" -c, --compare List objects that are not comparable\n"); printf(" -N, --nan Avoid NaNs detection\n"); - - printf(" -n C, --count=C Print differences up to C number\n"); - printf(" -d D, --delta=D Print difference when greater than limit D\n"); - printf(" -p R, --relative=R Print difference when greater than relative limit R\n"); - - - printf("\n"); - - printf(" C - is a positive integer\n"); - printf(" D - is a positive number. Compare criteria is |a - b| > D\n"); - printf(" R - is a positive number. Compare criteria is |(b-a)/a| > R\n"); - + printf(" -n C, --count=C Print differences up to C number, C is a positive integer.\n"); + + printf(" -d D, --delta=D Print difference if (|a-b| > D), D is a positive number.\n"); + printf(" -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number.\n"); + printf(" --use-system-epsilon Print difference if (|a-b| > EPSILON),\n"); + printf(" where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. \n"); + printf(" If the system epsilon is not defined, use the value below:\n"); + printf(" FLT_EPSILON = 1.19209E-07 for float\n"); + printf(" DBL_EPSILON = 2.22045E-16 for double\n"); + + printf(" -d, -p, and --use-system-epsilon options are used for comparing floating point values.\n"); + printf(" By default, strict equality is used. Use -p or -d to set specific tolerance.\n"); printf("\n"); printf(" Modes of output:\n"); diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/h5diff/testfiles/h5diff_10.txt index 38246d9..4788a79 100644 --- a/tools/h5diff/testfiles/h5diff_10.txt +++ b/tools/h5diff/testfiles/h5diff_10.txt @@ -11,13 +11,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/h5diff/testfiles/h5diff_600.txt index 17af208..82c5240 100644 --- a/tools/h5diff/testfiles/h5diff_600.txt +++ b/tools/h5diff/testfiles/h5diff_600.txt @@ -11,13 +11,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/h5diff/testfiles/h5diff_603.txt index 30fe246..e115114 100644 --- a/tools/h5diff/testfiles/h5diff_603.txt +++ b/tools/h5diff/testfiles/h5diff_603.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_604.txt b/tools/h5diff/testfiles/h5diff_604.txt index 9357b26..554f2ed 100644 --- a/tools/h5diff/testfiles/h5diff_604.txt +++ b/tools/h5diff/testfiles/h5diff_604.txt @@ -1,63 +1,2 @@ -<-d 0> is not a valid option -usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] - file1 File name of the first HDF5 file - file2 File name of the second HDF5 file - [obj1] Name of an HDF5 object, in absolute path - [obj2] Name of an HDF5 object, in absolute path - OPTIONS - -h, --help Print a usage message and exit - -V, --version Print version number and exit - -r, --report Report mode. Print differences - -v, --verbose Verbose mode. Print differences, list of objects - -q, --quiet Quiet mode. Do not do output - -c, --compare List objects that are not comparable - -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R - - Modes of output: - - Default mode: print the number of differences found and where they occured - -r Report mode: print the above plus the differences - -v Verbose mode: print the above plus a list of objects and warnings - -q Quiet mode: do not print output - - Compare criteria - - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files - - The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 4) links: name string difference - of the linked value - - Return exit code: - - 1 if differences found, 0 if no differences, 2 if error - - Examples of use: - - 1) h5diff file1 file2 /g1/dset1 /g1/dset2 - - Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2 - - 2) h5diff file1 file2 /g1/dset1 - - Compares object '/g1/dset1' in both files - - 3) h5diff file1 file2 - - Compares all objects in both files - - Note) file1 and file2 can be the same file. Use - - h5diff file1 file1 /g1/dset1 /g1/dset2 - - to compare '/g1/dset1' and '/g1/dset2' in the same file - +dataset: and +6 differences found diff --git a/tools/h5diff/testfiles/h5diff_605.txt b/tools/h5diff/testfiles/h5diff_605.txt index 1c99713..554f2ed 100644 --- a/tools/h5diff/testfiles/h5diff_605.txt +++ b/tools/h5diff/testfiles/h5diff_605.txt @@ -1,63 +1,2 @@ -<-d u> is not a valid option -usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] - file1 File name of the first HDF5 file - file2 File name of the second HDF5 file - [obj1] Name of an HDF5 object, in absolute path - [obj2] Name of an HDF5 object, in absolute path - OPTIONS - -h, --help Print a usage message and exit - -V, --version Print version number and exit - -r, --report Report mode. Print differences - -v, --verbose Verbose mode. Print differences, list of objects - -q, --quiet Quiet mode. Do not do output - -c, --compare List objects that are not comparable - -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R - - Modes of output: - - Default mode: print the number of differences found and where they occured - -r Report mode: print the above plus the differences - -v Verbose mode: print the above plus a list of objects and warnings - -q Quiet mode: do not print output - - Compare criteria - - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files - - The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 4) links: name string difference - of the linked value - - Return exit code: - - 1 if differences found, 0 if no differences, 2 if error - - Examples of use: - - 1) h5diff file1 file2 /g1/dset1 /g1/dset2 - - Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2 - - 2) h5diff file1 file2 /g1/dset1 - - Compares object '/g1/dset1' in both files - - 3) h5diff file1 file2 - - Compares all objects in both files - - Note) file1 and file2 can be the same file. Use - - h5diff file1 file1 /g1/dset1 /g1/dset2 - - to compare '/g1/dset1' and '/g1/dset2' in the same file - +dataset: and +6 differences found diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/h5diff/testfiles/h5diff_606.txt index 0567106..db361fd 100644 --- a/tools/h5diff/testfiles/h5diff_606.txt +++ b/tools/h5diff/testfiles/h5diff_606.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/h5diff/testfiles/h5diff_612.txt index 505705b..bbd6b00 100644 --- a/tools/h5diff/testfiles/h5diff_612.txt +++ b/tools/h5diff/testfiles/h5diff_612.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_613.txt b/tools/h5diff/testfiles/h5diff_613.txt index 1a89746..554f2ed 100644 --- a/tools/h5diff/testfiles/h5diff_613.txt +++ b/tools/h5diff/testfiles/h5diff_613.txt @@ -1,63 +1,2 @@ -<-p 0> is not a valid option -usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] - file1 File name of the first HDF5 file - file2 File name of the second HDF5 file - [obj1] Name of an HDF5 object, in absolute path - [obj2] Name of an HDF5 object, in absolute path - OPTIONS - -h, --help Print a usage message and exit - -V, --version Print version number and exit - -r, --report Report mode. Print differences - -v, --verbose Verbose mode. Print differences, list of objects - -q, --quiet Quiet mode. Do not do output - -c, --compare List objects that are not comparable - -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R - - Modes of output: - - Default mode: print the number of differences found and where they occured - -r Report mode: print the above plus the differences - -v Verbose mode: print the above plus a list of objects and warnings - -q Quiet mode: do not print output - - Compare criteria - - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files - - The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 4) links: name string difference - of the linked value - - Return exit code: - - 1 if differences found, 0 if no differences, 2 if error - - Examples of use: - - 1) h5diff file1 file2 /g1/dset1 /g1/dset2 - - Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2 - - 2) h5diff file1 file2 /g1/dset1 - - Compares object '/g1/dset1' in both files - - 3) h5diff file1 file2 - - Compares all objects in both files - - Note) file1 and file2 can be the same file. Use - - h5diff file1 file1 /g1/dset1 /g1/dset2 - - to compare '/g1/dset1' and '/g1/dset2' in the same file - +dataset: and +6 differences found diff --git a/tools/h5diff/testfiles/h5diff_614.txt b/tools/h5diff/testfiles/h5diff_614.txt index ec12818..554f2ed 100644 --- a/tools/h5diff/testfiles/h5diff_614.txt +++ b/tools/h5diff/testfiles/h5diff_614.txt @@ -1,63 +1,2 @@ -<-p u> is not a valid option -usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] - file1 File name of the first HDF5 file - file2 File name of the second HDF5 file - [obj1] Name of an HDF5 object, in absolute path - [obj2] Name of an HDF5 object, in absolute path - OPTIONS - -h, --help Print a usage message and exit - -V, --version Print version number and exit - -r, --report Report mode. Print differences - -v, --verbose Verbose mode. Print differences, list of objects - -q, --quiet Quiet mode. Do not do output - -c, --compare List objects that are not comparable - -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R - - Modes of output: - - Default mode: print the number of differences found and where they occured - -r Report mode: print the above plus the differences - -v Verbose mode: print the above plus a list of objects and warnings - -q Quiet mode: do not print output - - Compare criteria - - If no objects [obj1[obj2]] are specified, h5diff only compares objects - with the same absolute path in both files - - The compare criteria is: - 1) datasets: numerical array differences 2) groups: name string difference - 3) datatypes: the return value of H5Tequal 4) links: name string difference - of the linked value - - Return exit code: - - 1 if differences found, 0 if no differences, 2 if error - - Examples of use: - - 1) h5diff file1 file2 /g1/dset1 /g1/dset2 - - Compares object '/g1/dset1' in file1 with '/g1/dset2' in file2 - - 2) h5diff file1 file2 /g1/dset1 - - Compares object '/g1/dset1' in both files - - 3) h5diff file1 file2 - - Compares all objects in both files - - Note) file1 and file2 can be the same file. Use - - h5diff file1 file1 /g1/dset1 /g1/dset2 - - to compare '/g1/dset1' and '/g1/dset2' in the same file - +dataset: and +6 differences found diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/h5diff/testfiles/h5diff_615.txt index 8528c0e..9c8f0c7 100644 --- a/tools/h5diff/testfiles/h5diff_615.txt +++ b/tools/h5diff/testfiles/h5diff_615.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/h5diff/testfiles/h5diff_621.txt index 96d6c3f..79eebed 100644 --- a/tools/h5diff/testfiles/h5diff_621.txt +++ b/tools/h5diff/testfiles/h5diff_621.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/h5diff/testfiles/h5diff_622.txt index 9dc3751..09de51d 100644 --- a/tools/h5diff/testfiles/h5diff_622.txt +++ b/tools/h5diff/testfiles/h5diff_622.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/h5diff/testfiles/h5diff_623.txt index a02f5ea..dc60b94 100644 --- a/tools/h5diff/testfiles/h5diff_623.txt +++ b/tools/h5diff/testfiles/h5diff_623.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/h5diff/testfiles/h5diff_624.txt index 396a007..016ab77 100644 --- a/tools/h5diff/testfiles/h5diff_624.txt +++ b/tools/h5diff/testfiles/h5diff_624.txt @@ -12,13 +12,16 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] -q, --quiet Quiet mode. Do not do output -c, --compare List objects that are not comparable -N, --nan Avoid NaNs detection - -n C, --count=C Print differences up to C number - -d D, --delta=D Print difference when greater than limit D - -p R, --relative=R Print difference when greater than relative limit R - - C - is a positive integer - D - is a positive number. Compare criteria is |a - b| > D - R - is a positive number. Compare criteria is |(b-a)/a| > R + -n C, --count=C Print differences up to C number, C is a positive integer. + -d D, --delta=D Print difference if (|a-b| > D), D is a positive number. + -p R, --relative=R Print difference if (|(a-b)/b| > R), R is a positive number. + --use-system-epsilon Print difference if (|a-b| > EPSILON), + where EPSILON (FLT_EPSILON or FLT_EPSILON) is the system epsilon value. + If the system epsilon is not defined, use the value below: + FLT_EPSILON = 1.19209E-07 for float + DBL_EPSILON = 2.22045E-16 for double + -d, -p, and --use-system-epsilon options are used for comparing floating point values. + By default, strict equality is used. Use -p or -d to set specific tolerance. Modes of output: diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh index 4167243..b8e743d 100755 --- a/tools/h5diff/testh5diff.sh +++ b/tools/h5diff/testh5diff.sh @@ -461,9 +461,9 @@ TOOLTEST h5diff_606.txt -d 0x1 $FILE1 $FILE2 g1/dset3 g1/dset4 TESTING $H5DIFF -d "1" $SRCFILE1 $SRCFILE2 g1/dset3 g1/dset4 TOOLTEST h5diff_607.txt -d "1" $FILE1 $FILE2 g1/dset3 g1/dset4 -# 6.8: repeated option -TESTING $H5DIFF -d 1 -d 2 $SRCFILE1 $SRCFILE2 g1/dset3 g1/dset4 -TOOLTEST h5diff_608.txt -d 1 -d 2 $FILE1 $FILE2 g1/dset3 g1/dset4 +# 6.8: use system epsilon +TESTING $H5DIFF --use-system-epsilon $SRCFILE1 $SRCFILE2 g1/dset3 g1/dset4 +TOOLTEST h5diff_608.txt --use-system-epsilon $FILE1 $FILE2 g1/dset3 g1/dset4 # 6.9: number larger than biggest difference TESTING $H5DIFF -d 200 $SRCFILE1 $SRCFILE2 g1/dset3 g1/dset4 diff --git a/tools/lib/h5diff.h b/tools/lib/h5diff.h index e0f2ad0..df264dd 100644 --- a/tools/lib/h5diff.h +++ b/tools/lib/h5diff.h @@ -25,21 +25,22 @@ */ typedef struct { - int m_quiet; /* quiet mide: no output at all */ - int m_report; /* report mode: print the data */ - int m_verbose; /* verbose mode: print the data, list of objcets, warnings */ - int d; /* delta, absolute value to compare */ - double delta; /* delta value */ - int p; /* relative error to compare*/ - double percent; /* relative error value */ - int n; /* count, compare up to count */ - hsize_t count; /* count value */ - int err_stat; /* an error ocurred (1, error, 0, no error) */ - int cmn_objs; /* do we have common objects */ - int not_cmp; /* are the objects comparable */ - int contents; /* equal contents */ - int do_nans; /* consider Nans while diffing floats */ - int m_list_not_cmp; /* list not comparable messages */ + int m_quiet; /* quiet mide: no output at all */ + int m_report; /* report mode: print the data */ + int m_verbose; /* verbose mode: print the data, list of objcets, warnings */ + int d; /* delta, absolute value to compare */ + double delta; /* delta value */ + int p; /* relative error to compare*/ + int use_system_epsilon; /* flag to use system epsilon (1 or 0) */ + double percent; /* relative error value */ + int n; /* count, compare up to count */ + hsize_t count; /* count value */ + int err_stat; /* an error ocurred (1, error, 0, no error) */ + int cmn_objs; /* do we have common objects */ + int not_cmp; /* are the objects comparable */ + int contents; /* equal contents */ + int do_nans; /* consider Nans while diffing floats */ + int m_list_not_cmp; /* list not comparable messages */ } diff_opt_t; diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c index 735ea70..77ee74a 100644 --- a/tools/lib/h5diff_array.c +++ b/tools/lib/h5diff_array.c @@ -74,9 +74,16 @@ #define ULLI_FORMAT_P_NOTCOMP "%-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"u %-15"H5_PRINTF_LL_WIDTH"d not comparable\n" -/* values for FLT_EPSILON same as C Reference manual */ -#define H5DIFF_FLT_EPSILON .00001 -#define H5DIFF_DBL_EPSILON .000000001 +/* if system EPSILON is defined, use the system EPSILON; otherwise, use + constants that are close to most EPSILON values */ + +#ifndef FLT_EPSILON +#define FLT_EPSILON 1.19209E-07 +#endif + +#ifndef DBL_EPSILON +#define DBL_EPSILON 2.22045E-16 +#endif /*------------------------------------------------------------------------- @@ -5502,10 +5509,6 @@ error: static hbool_t equal_double(double value, double expected, diff_opt_t *options) { - int both_zero; - int is_zero; - - if ( options->do_nans ) { @@ -5535,22 +5538,15 @@ hbool_t equal_double(double value, double expected, diff_opt_t *options) } } - BOTH_ZERO(value,expected) - if (both_zero) - return TRUE; - - IS_ZERO(expected) - if (is_zero) - return(equal_double(expected,value,options)); - if (value == expected) return TRUE; - if ( ABS( (value-expected) / expected) < H5DIFF_DBL_EPSILON) - return TRUE; - else - return FALSE; + if (options->use_system_epsilon) { + if ( ABS( (value-expected) ) < DBL_EPSILON) + return TRUE; + } + return FALSE; } /*------------------------------------------------------------------------- @@ -5566,10 +5562,6 @@ hbool_t equal_double(double value, double expected, diff_opt_t *options) static hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *options) { - int both_zero; - int is_zero; - - if ( options->do_nans ) { @@ -5599,22 +5591,15 @@ hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *optio } } - BOTH_ZERO(value,expected) - if (both_zero) - return TRUE; - - IS_ZERO(expected) - if (is_zero) - return(equal_ldouble(expected,value,options)); - if (value == expected) return TRUE; - if ( ABS( (value-expected) / expected) < H5DIFF_DBL_EPSILON) - return TRUE; - else - return FALSE; + if (options->use_system_epsilon) { + if ( ABS( (value-expected) / expected) < DBL_EPSILON) + return TRUE; + } + return FALSE; } #endif /* #if H5_SIZEOF_LONG_DOUBLE !=0 */ @@ -5634,9 +5619,6 @@ hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *optio static hbool_t equal_float(float value, float expected, diff_opt_t *options) { - int both_zero; - int is_zero; - if ( options->do_nans ) { @@ -5666,21 +5648,15 @@ hbool_t equal_float(float value, float expected, diff_opt_t *options) } } - BOTH_ZERO(value,expected) - if (both_zero) - return TRUE; - - IS_ZERO(expected) - if (is_zero) - return(equal_float(expected,value,options)); - if (value == expected) return TRUE; - if ( ABS( (value-expected) / expected) < H5DIFF_FLT_EPSILON) - return TRUE; - else - return FALSE; + if (options->use_system_epsilon) { + if ( ABS( (value-expected) / expected) < FLT_EPSILON) + return TRUE; + } + + return FALSE; } -- cgit v0.12