summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2016-06-30 20:59:15 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2016-06-30 20:59:15 (GMT)
commit35e6928220ad9381b480f8e21e54027a9509fa36 (patch)
tree62a058678fba7ac687ff0b48b781436feebb3020
parent1f811eccebeb991faafd9ce21f5960b70cd555eb (diff)
downloadhdf5-35e6928220ad9381b480f8e21e54027a9509fa36.zip
hdf5-35e6928220ad9381b480f8e21e54027a9509fa36.tar.gz
hdf5-35e6928220ad9381b480f8e21e54027a9509fa36.tar.bz2
[svn-r30127] Description:
Use internal rounding routine, if the StdC ones aren't available (like on Windows). Tested on: MacOSX/64 10.11.5 (amazon) w/serial & parallel (h5committest forthcoming)
-rw-r--r--configure.ac1
-rw-r--r--src/H5Zscaleoffset.c52
2 files changed, 53 insertions, 0 deletions
diff --git a/configure.ac b/configure.ac
index b6bb44c..74342eb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1848,6 +1848,7 @@ AC_CHECK_FUNCS([lstat rand_r random setsysinfo])
AC_CHECK_FUNCS([signal longjmp setjmp siglongjmp sigsetjmp sigprocmask])
AC_CHECK_FUNCS([snprintf srandom strdup symlink system])
AC_CHECK_FUNCS([tmpfile asprintf vasprintf vsnprintf waitpid])
+AC_CHECK_FUNCS([roundf lroundf llroundf round lround llround])
## ----------------------------------------------------------------------
## Check compiler characteristics
diff --git a/src/H5Zscaleoffset.c b/src/H5Zscaleoffset.c
index 1cca9b1..91a6c00 100644
--- a/src/H5Zscaleoffset.c
+++ b/src/H5Zscaleoffset.c
@@ -667,6 +667,58 @@ H5Z_class2_t H5Z_SCALEOFFSET[1] = {{
H5Z_scaleoffset_modify_4(i, type, pow_fun, buf, d_nelmts, min, D_val) \
}
+/* Include our own rounding routine and alias it to the stdc macros, if they
+ * aren't available.
+ */
+#if !(defined(H5_HAVE_LLROUND) && defined(H5_HAVE_LLROUNDF) && defined(H5_HAVE_LROUND) && defined(H5_HAVE_LROUNDF) && defined(H5_HAVE_ROUND) && defined(H5_HAVE_ROUNDF))
+/* Round a floating-point value to the nearest integer value 4/19/05 */
+/* rounding to the bigger absolute value if val is in the middle,
+ 0.5 -> 1, -0.5 ->-1
+5/9/05, KY */
+static double
+H5Z__scaleoffset_rnd(double val)
+{
+ double u_val, l_val;
+
+ u_val = HDceil(val);
+ l_val = HDfloor(val);
+
+ if(val > 0) {
+ if((u_val - val) <= (val - l_val))
+ return u_val;
+ else
+ return l_val;
+ } /* end if */
+ else {
+ if((val - l_val) <= (u_val - val))
+ return l_val;
+ else
+ return u_val;
+ }
+} /* H5Z__scaleoffset_rnd() */
+
+/* Alias rounding macros to routine above, if not defined */
+#if !defined(H5_HAVE_LLROUND)
+#define llround(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_LLROUND) */
+#if !defined(H5_HAVE_LLROUNDF)
+#define llroundf(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_LLROUNDF) */
+#if !defined(H5_HAVE_LROUND)
+#define lround(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_LROUND) */
+#if !defined(H5_HAVE_LROUNDF)
+#define lroundf(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_LROUNDF) */
+#if !defined(H5_HAVE_ROUND)
+#define round(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_ROUND) */
+#if !defined(H5_HAVE_ROUNDF)
+#define roundf(x) H5Z__scaleoffset_rnd(x)
+#endif /* !defined(H5_HAVE_ROUNDF) */
+
+#endif /* !(defined(H5_HAVE_LLROUND) && defined(H5_HAVE_LLROUNDF) && defined(H5_HAVE_LROUND) && defined(H5_HAVE_LROUNDF) && defined(H5_HAVE_ROUND) && defined(H5_HAVE_ROUNDF)) */
+
/*-------------------------------------------------------------------------
* Function: H5Z_can_apply_scaleoffset