summaryrefslogtreecommitdiffstats
path: root/tools/lib/h5diff_array.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/lib/h5diff_array.c')
-rw-r--r--tools/lib/h5diff_array.c80
1 files changed, 57 insertions, 23 deletions
diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c
index fa4ebec..f0da960 100644
--- a/tools/lib/h5diff_array.c
+++ b/tools/lib/h5diff_array.c
@@ -22,7 +22,7 @@
*-------------------------------------------------------------------------
*/
-#define F_FORMAT "%-15f %-15f %-15f\n"
+#define F_FORMAT "%-15g %-15g %-15g\n"
#define I_FORMAT "%-15d %-15d %-15d\n"
#define C_FORMAT "%-16c %-17c\n"
#define S_FORMAT "%-16s %-17s\n"
@@ -53,6 +53,7 @@
static int both_zero;
+static int is_zero;
static float per;
@@ -78,22 +79,33 @@ static float per;
per = (float)fabs( ((float)B - (float)A) / (float) A ); \
}
+#define BOTH_ZERO(A,B) { both_zero=0; \
+ if (A==0 && B==0) \
+ both_zero=1; \
+ }
+
+#define IS_ZERO(A) { is_zero=0; \
+ if (A==0) \
+ is_zero=1; \
+ }
+
/*-------------------------------------------------------------------------
* local prototypes
*-------------------------------------------------------------------------
*/
static void close_obj(H5G_obj_t obj_type, hid_t obj_id);
static hsize_t diff_region(hid_t obj1_id, hid_t obj2_id,hid_t region1_id, hid_t region2_id, diff_opt_t *options);
-static hbool_t is_zero(const void *_mem, size_t size);
+static hbool_t all_zero(const void *_mem, size_t size);
static int ull2float(unsigned long_long ull_value, float *f_value);
static hsize_t character_compare(unsigned char *mem1,unsigned char *mem2,hsize_t i,int rank,hsize_t *acc,hsize_t *pos,diff_opt_t *options,const char *obj1,const char *obj2,int *ph);
static hsize_t character_compare_opt(unsigned char *mem1,unsigned char *mem2,hsize_t i,int rank,hsize_t *acc,hsize_t *pos,diff_opt_t *options,const char *obj1,const char *obj2,int *ph);
+/* values for FLT_EPSILON same as C Reference manual */
+#define H5DIFF_FLT_EPSILON .00001
+#define H5DIFF_DBL_EPSILON .000000001
-#ifdef NOT_YET
-#define EPSILON .0000001
static hbool_t equal_float(float value, float expected);
-#endif
+static hbool_t equal_double(double value, double expected);
/*-------------------------------------------------------------------------
@@ -658,8 +670,8 @@ hsize_t diff_datum(void *_mem1,
case H5T_REFERENCE:
- iszero1=is_zero(_mem1, H5Tget_size(m_type));
- iszero2=is_zero(_mem2, H5Tget_size(m_type));
+ iszero1=all_zero(_mem1, H5Tget_size(m_type));
+ iszero2=all_zero(_mem2, H5Tget_size(m_type));
if (iszero1==1 || iszero2==1)
{
return 0;
@@ -1874,7 +1886,7 @@ hsize_t diff_datum(void *_mem1,
}
}
- else if (temp1_float != temp2_float)
+ else if (equal_float(temp1_float,temp2_float)==FALSE)
{
if ( print_data(options) )
@@ -1982,9 +1994,7 @@ hsize_t diff_datum(void *_mem1,
}
}
-
-
- else if (temp1_double != temp2_double)
+ else if (equal_double(temp1_double,temp2_double)==FALSE)
{
if ( print_data(options) )
{
@@ -2009,7 +2019,7 @@ hsize_t diff_datum(void *_mem1,
/*-------------------------------------------------------------------------
- * Function: is_zero
+ * Function: all_zero
*
* Purpose: Determines if memory is initialized to all zero bytes.
*
@@ -2018,7 +2028,7 @@ hsize_t diff_datum(void *_mem1,
*-------------------------------------------------------------------------
*/
-static hbool_t is_zero(const void *_mem, size_t size)
+static hbool_t all_zero(const void *_mem, size_t size)
{
const unsigned char *mem = (const unsigned char *)_mem;
@@ -2591,7 +2601,7 @@ hsize_t diff_float(unsigned char *mem1,
memcpy(&temp1_float, mem1, sizeof(float));
memcpy(&temp2_float, mem2, sizeof(float));
- if (temp1_float != temp2_float)
+ if (equal_float(temp1_float,temp2_float)==FALSE)
{
if ( print_data(options) )
{
@@ -2761,7 +2771,7 @@ hsize_t diff_double(unsigned char *mem1,
memcpy(&temp1_double, mem1, sizeof(double));
memcpy(&temp2_double, mem2, sizeof(double));
- if (temp1_double != temp2_double)
+ if (equal_double(temp1_double,temp2_double)==FALSE)
{
if ( print_data(options) )
{
@@ -4579,7 +4589,7 @@ error:
/*-------------------------------------------------------------------------
- * Function: equal_float
+ * Function: equal_float, equal_double
*
* Purpose: use a relative error formula to deal with floating point
* uncertainty
@@ -4592,17 +4602,41 @@ error:
*-------------------------------------------------------------------------
*/
-#ifdef NOT_YET
static
hbool_t equal_float(float value, float expected)
{
- if ( fabs( (value-expected) / expected) < EPSILON)
- return TRUE;
- else
- return FALSE;
-
+ BOTH_ZERO(value,expected)
+ if (both_zero)
+ return TRUE;
+
+ IS_ZERO(expected)
+ if (is_zero)
+ return(equal_float(expected,value));
+
+ if ( fabs( (value-expected) / expected) < H5DIFF_FLT_EPSILON)
+ return TRUE;
+ else
+ return FALSE;
+
+}
+
+static
+hbool_t equal_double(double value, double expected)
+{
+ BOTH_ZERO(value,expected)
+ if (both_zero)
+ return TRUE;
+
+ IS_ZERO(expected)
+ if (is_zero)
+ return(equal_double(expected,value));
+
+ if ( fabs( (value-expected) / expected) < H5DIFF_DBL_EPSILON)
+ return TRUE;
+ else
+ return FALSE;
+
}
-#endif