diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-05 22:14:34 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-05 22:14:34 +0000 |
commit | c120ef140a61483e238229e690486821b4375330 (patch) | |
tree | f504b2d268647874e55d8ef70dee853132ef178d /libgfortran | |
parent | 9dfbac5b94278cac26c43986553827e0fe4adc8e (diff) | |
download | gcc-c120ef140a61483e238229e690486821b4375330.zip gcc-c120ef140a61483e238229e690486821b4375330.tar.gz gcc-c120ef140a61483e238229e690486821b4375330.tar.bz2 |
re PR fortran/31202 (Incorrect rounding generated for NINT)
2007-08-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/31202
* intrinsics/c99_functions.c (roundl): Provide fallback
implementation for systems without ceill.
* c99_protos.h (roundl): Define prototype in all cases.
From-SVN: r127227
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 7 | ||||
-rw-r--r-- | libgfortran/c99_protos.h | 2 | ||||
-rw-r--r-- | libgfortran/intrinsics/c99_functions.c | 24 |
3 files changed, 31 insertions, 2 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2ccb46b..bb999ec 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,10 @@ +2007-08-05 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR fortran/31202 + * intrinsics/c99_functions.c (roundl): Provide fallback + implementation for systems without ceill. + * c99_protos.h (roundl): Define prototype in all cases. + 2007-08-03 Thomas Koenig <tkoenig@gcc.gnu.org> PR libfortran/32977 diff --git a/libgfortran/c99_protos.h b/libgfortran/c99_protos.h index c4738db..e511b68 100644 --- a/libgfortran/c99_protos.h +++ b/libgfortran/c99_protos.h @@ -200,7 +200,7 @@ extern double round(double); extern float roundf(float); #endif -#if !defined(HAVE_ROUNDL) && defined(HAVE_CEILL) +#if !defined(HAVE_ROUNDL) #define HAVE_ROUNDL 1 extern long double roundl(long double); #endif diff --git a/libgfortran/intrinsics/c99_functions.c b/libgfortran/intrinsics/c99_functions.c index e36c5ba..65c284e 100644 --- a/libgfortran/intrinsics/c99_functions.c +++ b/libgfortran/intrinsics/c99_functions.c @@ -500,8 +500,9 @@ powf(float x, float y) /* Algorithm by Steven G. Kargl. */ -#if !defined(HAVE_ROUNDL) && defined(HAVE_CEILL) +#if !defined(HAVE_ROUNDL) #define HAVE_ROUNDL 1 +#if defined(HAVE_CEILL) /* Round to nearest integral value. If the argument is halfway between two integral values then round away from zero. */ @@ -527,6 +528,27 @@ roundl(long double x) return (-t); } } +#else + +/* Poor version of roundl for system that don't have ceill. */ +long double +roundl(long double x) +{ + if (x > DBL_MAX || x < -DBL_MAX) + { +#ifdef HAVE_NEXTAFTERL + static long double prechalf = nexafterl (0.5L, LDBL_MAX); +#else + static long double prechalf = 0.5L; +#endif + return (GFC_INTEGER_LARGEST) (x + (x > 0 ? prechalf : -prechalf)); + } + else + /* Use round(). */ + return round((double) x); +} + +#endif #endif #ifndef HAVE_ROUND |