summaryrefslogtreecommitdiffstats
path: root/lib/msun/src/s_rintf.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1996-08-28 16:34:36 +0000
committerbde <bde@FreeBSD.org>1996-08-28 16:34:36 +0000
commitf68534c325392a29ec468b68fad7e222de0b868b (patch)
tree1263974842c58b03868a54b6d0c8d0754e88b3d5 /lib/msun/src/s_rintf.c
parentf596cd4a0d4dc86794c1d9ea1142eff8ae4b8093 (diff)
downloadFreeBSD-src-f68534c325392a29ec468b68fad7e222de0b868b.zip
FreeBSD-src-f68534c325392a29ec468b68fad7e222de0b868b.tar.gz
Made rintf() actually work. It was completely broken (when s_rint.c
was compiled with -O) by the precision bug in the i386 version of gcc (assignments and casts don't clip the precision). E.g., rintf(12.3456789) was 12.125. Avoid the same bug in rint(). It was only broken for the unusual case when the i387 precision is 64 bits. FreeBSD defaults to 53 bit precision to avoid problems like this, but the standard math emulator always uses 64 bit precision.
Diffstat (limited to 'lib/msun/src/s_rintf.c')
-rw-r--r--lib/msun/src/s_rintf.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/msun/src/s_rintf.c b/lib/msun/src/s_rintf.c
index 4e77aab..90a85a3 100644
--- a/lib/msun/src/s_rintf.c
+++ b/lib/msun/src/s_rintf.c
@@ -14,16 +14,22 @@
*/
#ifndef lint
-static char rcsid[] = "$Id: s_rintf.c,v 1.1.1.1 1994/08/19 09:39:58 jkh Exp $";
+static char rcsid[] = "$Id: s_rintf.c,v 1.2 1995/05/30 05:50:21 rgrimes Exp $";
#endif
#include "math.h"
#include "math_private.h"
+/*
+ * TWO23 is double instead of float to avoid a bug in gcc. Without
+ * this, gcc thinks that TWO23[sx]+x and w-TWO23[sx] already have float
+ * precision and doesn't clip them to float precision when they are
+ * assigned and returned.
+ */
#ifdef __STDC__
-static const float
+static const double
#else
-static float
+static double
#endif
TWO23[2]={
8.3886080000e+06, /* 0x4b000000 */
OpenPOWER on IntegriCloud