[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
roundf on mingw
From: |
Bruno Haible |
Subject: |
roundf on mingw |
Date: |
Sun, 20 Apr 2008 16:15:39 +0200 |
User-agent: |
KMail/1.5.4 |
The roundf test fails on mingw:
bad round implementation: roundf(0.5(0x1.fffffep-2)) = 0(0x0p+0) or 1(0x1p+0)?
bad round implementation: roundf(8.38861e+006(0x1.000002p+23)) =
8.38861e+006(0x1.000002p+23) or 8.38861e+006(0x1.000004p+23)?
...
This should fix it (similar to the test done in m4/round.m4).
2008-04-20 Bruno Haible <address@hidden>
* m4/roundf.m4 (gl_FUNC_ROUNDF): Add test whether roundf actually
works.
* doc/posix-functions/roundf.texi: Mention roundf bug on mingw.
*** doc/posix-functions/roundf.texi.orig 2008-04-20 16:14:11.000000000
+0200
--- doc/posix-functions/roundf.texi 2008-04-20 16:05:35.000000000 +0200
***************
*** 11,16 ****
--- 11,19 ----
@item
This function is missing on some platforms:
FreeBSD 5.2.1, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 4.0, Solaris
9, Interix 3.5.
+ @item
+ This functions returns a wrong result for x = 1/2 - 2^-25 on some platforms:
+ mingw.
@end itemize
Portability problems not fixed by Gnulib:
*** m4/roundf.m4.orig 2008-04-20 16:14:11.000000000 +0200
--- m4/roundf.m4 2008-04-20 16:11:52.000000000 +0200
***************
*** 1,5 ****
! # roundf.m4 serial 4
! dnl Copyright (C) 2007 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
--- 1,5 ----
! # roundf.m4 serial 5
! dnl Copyright (C) 2007-2008 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
***************
*** 13,18 ****
--- 13,53 ----
if test "$ac_cv_have_decl_roundf" = yes; then
gl_CHECK_MATH_LIB([ROUNDF_LIBM], [x = roundf (x);])
fi
+ if test "$ac_cv_have_decl_roundf" = yes && test "$ROUNDF_LIBM" != missing;
then
+ dnl Test whether roundf() produces correct results. On mingw, for
+ dnl x = 1/2 - 2^-25, the system's roundf() returns a wrong result.
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
+ AC_CACHE_CHECK([whether roundf works], [gl_cv_func_roundf_works],
+ [
+ save_LIBS="$LIBS"
+ LIBS="$LIBS $ROUNDF_LIBM"
+ AC_TRY_RUN([
+ #include <float.h>
+ #include <math.h>
+ int main()
+ {
+ /* 2^FLT_MANT_DIG. */
+ static const float TWO_MANT_DIG =
+ /* Assume FLT_MANT_DIG <= 3 * 31.
+ Use the identity n = floor(n/3) + floor((n+1)/3) + floor((n+2)/3). */
+ (float) (1U << (FLT_MANT_DIG / 3))
+ * (float) (1U << ((FLT_MANT_DIG + 1) / 3))
+ * (float) (1U << ((FLT_MANT_DIG + 2) / 3));
+ volatile float x = 0.5f - 0.5f / TWO_MANT_DIG;
+ exit (x < 0.5f && roundf (x) != 0.0f);
+ }], [gl_cv_func_roundf_works=yes], [gl_cv_func_roundf_works=no],
+ [case "$host_os" in
+ mingw*) gl_cv_func_roundf_works="guessing no";;
+ *) gl_cv_func_roundf_works="guessing yes";;
+ esac
+ ])
+ LIBS="$save_LIBS"
+ ])
+ case "$gl_cv_func_roundf_works" in
+ *no) ROUNDF_LIBM=missing ;;
+ esac
+ fi
if test "$ac_cv_have_decl_roundf" != yes || test "$ROUNDF_LIBM" = missing;
then
REPLACE_ROUNDF=1
AC_LIBOBJ([roundf])
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- roundf on mingw,
Bruno Haible <=