From 35e6928220ad9381b480f8e21e54027a9509fa36 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Thu, 30 Jun 2016 15:59:15 -0500 Subject: [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) --- configure.ac | 1 + src/H5Zscaleoffset.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) 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 -- cgit v0.12