summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRaymond Lu <songyulu@hdfgroup.org>2009-08-20 18:40:50 (GMT)
committerRaymond Lu <songyulu@hdfgroup.org>2009-08-20 18:40:50 (GMT)
commit0b3b4351e7841f00cdcda837fc2960a37a923d69 (patch)
treeb2b34f09112d63444133446152742e321e895beb /src
parentf8c63dd9dcb4459dd8d57a2b2543e2e99f6d4a35 (diff)
downloadhdf5-0b3b4351e7841f00cdcda837fc2960a37a923d69.zip
hdf5-0b3b4351e7841f00cdcda837fc2960a37a923d69.tar.gz
hdf5-0b3b4351e7841f00cdcda837fc2960a37a923d69.tar.bz2
[svn-r17392] I added a detection for the correctness of converting from unsigned long to float in the
configure.in. The Pathscale compiler on Sandia's Linux machine misinterprets the values of unsigned long as negative during the conversion to float, when the first bit of unsigned long is on. Tested on jam. Need to test it on Sandia's machine.
Diffstat (limited to 'src')
-rw-r--r--src/H5T.c6
-rw-r--r--src/H5Tconv.c8
-rw-r--r--src/H5Tpkg.h12
-rw-r--r--src/H5config.h.in4
4 files changed, 22 insertions, 8 deletions
diff --git a/src/H5T.c b/src/H5T.c
index 4b710d3..1e30f77 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -1198,10 +1198,12 @@ H5T_init_interface(void)
#endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */
/* From unsigned long to floats */
-#if H5T_CONV_INTERNAL_ULONG_FP
+#if H5T_CONV_INTERNAL_ULONG_FLT
status |= H5T_register(H5T_PERS_HARD, "ulong_flt", native_ulong, native_float, H5T_conv_ulong_float, H5AC_dxpl_id, FALSE);
+#endif /* H5T_CONV_INTERNAL_ULONG_FLT */
+#if H5T_CONV_INTERNAL_ULONG_DBL
status |= H5T_register(H5T_PERS_HARD, "ulong_dbl", native_ulong, native_double, H5T_conv_ulong_double, H5AC_dxpl_id, FALSE);
-#endif /* H5T_CONV_INTERNAL_ULONG_FP */
+#endif /* H5T_CONV_INTERNAL_ULONG_DBL */
#if H5T_CONV_INTERNAL_ULONG_LDOUBLE
status |= H5T_register(H5T_PERS_HARD, "ulong_ldbl", native_ulong, native_ldouble, H5T_conv_ulong_ldouble, H5AC_dxpl_id, FALSE);
#endif /* H5T_CONV_INTERNAL_ULONG_LDOUBLE */
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index c621bf4..08e7fa1 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -8417,7 +8417,7 @@ done:
*
*-------------------------------------------------------------------------
*/
-#if H5T_CONV_INTERNAL_ULONG_FP
+#if H5T_CONV_INTERNAL_ULONG_FLT
herr_t
H5T_conv_ulong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride,
@@ -8433,7 +8433,7 @@ H5T_conv_ulong_float (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
done:
FUNC_LEAVE_NOAPI(ret_value)
}
-#endif /* H5T_CONV_INTERNAL_ULONG_FP */
+#endif /* H5T_CONV_INTERNAL_ULONG_FLT */
/*-------------------------------------------------------------------------
@@ -8451,7 +8451,7 @@ done:
*
*-------------------------------------------------------------------------
*/
-#if H5T_CONV_INTERNAL_ULONG_FP
+#if H5T_CONV_INTERNAL_ULONG_DBL
herr_t
H5T_conv_ulong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
size_t nelmts, size_t buf_stride,
@@ -8467,7 +8467,7 @@ H5T_conv_ulong_double (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
done:
FUNC_LEAVE_NOAPI(ret_value)
}
-#endif /* H5T_CONV_INTERNAL_ULONG_FP */
+#endif /* H5T_CONV_INTERNAL_ULONG_DBL */
/*-------------------------------------------------------------------------
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index 7ef4b63..18bf7cf 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -133,10 +133,18 @@
#define H5T_CONV_INTERNAL_INTEGER_LDOUBLE 1
#endif
-/* Define an internal macro for converting unsigned (long) long to floating numbers.
+/* Define an internal macro for converting unsigned long to float.
+ * Pathscale compiler on Sandia's Linux machine has some problem.
+ * 64-bit Solaris does different rounding. */
+#if (H5_WANT_DATA_ACCURACY && H5_ULONG_TO_FLOAT_ACCURATE && H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE) || \
+ (!H5_WANT_DATA_ACCURACY)
+#define H5T_CONV_INTERNAL_ULONG_FLT 1
+#endif
+
+/* Define an internal macro for converting unsigned (long) long to double.
* 64-bit Solaris does different rounding. */
#if (H5_WANT_DATA_ACCURACY && H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE) || (!H5_WANT_DATA_ACCURACY)
-#define H5T_CONV_INTERNAL_ULONG_FP 1
+#define H5T_CONV_INTERNAL_ULONG_DBL 1
#endif
/* Define an internal macro for converting unsigned long to long double. SGI compilers give some
diff --git a/src/H5config.h.in b/src/H5config.h.in
index 5877c6d..bb03fc7 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -620,6 +620,10 @@
correct precision. */
#undef ULLONG_TO_LDOUBLE_PRECISION
+/* Define if your system accurately converting unsigned long to float values.
+ */
+#undef ULONG_TO_FLOAT_ACCURATE
+
/* Define if your system can accurately convert unsigned (long) long values to
floating-point values. */
#undef ULONG_TO_FP_BOTTOM_BIT_ACCURATE