From: jdeifik AT weasel DOT com (Jeff Deifik) Subject: beta 20.1 and 19 and 18 'rint' function with gcc is broken 15 Dec 1998 10:36:13 -0800 Message-ID: <4.1.19981214084527.035e9470.cygnus.gnu-win32@pop.ni.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" To: gnu-win32 AT cygnus DOT com I have reported a bug with the math function rint. It is still not fixed with the latest beta-20.1 I am running windows nt 4.0 server, sp3. I have a library regression test that I run on the compilers I use. It showed a bug with the 'rint' function. This function is supposed to convert a double to an integral double value. It isn't working, as the enclosed test program shows. weasel_in_a_box:/e/j/util/test:505: uname -a CYGWIN_NT-4.0 WEASEL_IN_A_BOX 20.1 (0.3/1/1) 1998-12-3 20:39:18 i686 unknown Compile with no options, i.e. gcc yy.c yy The output should be nothing, but it is: 47.4 47.125000 47.6 47.625000 -47.4 -47.125000 -47.6 -47.625000 Jeff Deifik /* y.c, demonstrates a bug with gnu-w32 beta 18 and 19 and 20.1 */ /* Written 11/06/96 by Jeff Deifik */ /* Modified 05/11/97 by Jeff Deifik */ #include #include typedef enum { False = 0, True = 1 } Boolean; float FLOAT_TO_ROUNDED_FLOAT(float); int flo_close(double value,double f,double clo); int main(int argc, char *argv[]) { Boolean fail = False; double d; float f; d = rint(47); if (!flo_close(47.0f,d,0.0001f)) { (void)printf("47 %f\n",d); fail = True; } f = FLOAT_TO_ROUNDED_FLOAT(47.0); if (!flo_close(47.0f,f,0.0001f)) { (void)printf("47 %f\n",f); fail = True; } d = rint(47.4); if (!flo_close(47.0f,d,0.0001f)) { (void)printf("47.4 %f\n",d); fail = True; } d = rint(47.6); if (!flo_close(48.0f,d,0.0001f)) { (void)printf("47.6 %f\n",d); fail = True; } d = rint(-47); if (!flo_close(-47.0f,d,0.0001f)) { (void)printf("-47 %f\n",d); fail = True; } d = rint(-47.4); if (!flo_close(-47.0f,d,0.0001f)) { (void)printf("-47.4 %f\n",d); fail = True; } d = rint(-47.6); if (!flo_close(-48.0f,d,0.0001f)) { (void)printf("-47.6 %f\n",d); fail = True; } return 0; } /* Value is the ideal number, f is what it really is.*/ int flo_close(double value,double f,double clo) { return(((f+clo) >= value) && ((f-clo) <= value)); } float FLOAT_TO_ROUNDED_FLOAT(float x) { return(floor(x+0.5)); } - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".