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.
This commit is contained in:
Bruce Evans 1996-08-28 16:34:36 +00:00
parent 38005cc510
commit 2aa9f7ca2c
2 changed files with 19 additions and 6 deletions

View File

@ -11,7 +11,7 @@
*/
#ifndef lint
static char rcsid[] = "$Id: s_rint.c,v 1.1.1.1 1994/08/19 09:39:52 jkh Exp $";
static char rcsid[] = "$Id: s_rint.c,v 1.2 1995/05/30 05:50:18 rgrimes Exp $";
#endif
/*
@ -27,10 +27,17 @@ static char rcsid[] = "$Id: s_rint.c,v 1.1.1.1 1994/08/19 09:39:52 jkh Exp $";
#include "math.h"
#include "math_private.h"
/*
* TWO23 is long double instead of double to avoid a bug in gcc. Without
* this, gcc thinks that TWO23[sx]+x and w-TWO23[sx] already have double
* precision and doesn't clip them to double precision when they are
* assigned and returned. Use long double even in the !__STDC__ case in
* case this is compiled with gcc -traditional.
*/
#ifdef __STDC__
static const double
static const long double
#else
static double
static long double
#endif
TWO52[2]={
4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */

View File

@ -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 */