aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorFrancois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-05 22:14:34 +0000
committerFrançois-Xavier Coudert <fxcoudert@gcc.gnu.org>2007-08-05 22:14:34 +0000
commitc120ef140a61483e238229e690486821b4375330 (patch)
treef504b2d268647874e55d8ef70dee853132ef178d /libgfortran
parent9dfbac5b94278cac26c43986553827e0fe4adc8e (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libgfortran/c99_protos.h2
-rw-r--r--libgfortran/intrinsics/c99_functions.c24
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