From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21945 invoked by alias); 4 Mar 2002 04:49:52 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Received: (qmail 21796 invoked from network); 4 Mar 2002 04:49:46 -0000 Received: from unknown (HELO rwcrmhc54.attbi.com) (216.148.227.87) by sources.redhat.com with SMTP; 4 Mar 2002 04:49:46 -0000 Received: from attbi.com ([65.96.229.181]) by rwcrmhc54.attbi.com (InterMail vM.4.01.03.27 201-229-121-127-20010626) with ESMTP id <20020304044945.XKEN1214.rwcrmhc54.attbi.com@attbi.com>; Mon, 4 Mar 2002 04:49:45 +0000 Message-ID: <3C82FC59.2080700@attbi.com> Date: Sun, 03 Mar 2002 20:49:00 -0000 From: "Richard R. Malloy" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.4) Gecko/20011019 Netscape6/6.2 X-Accept-Language: en-us MIME-Version: 1.0 To: Randall R Schulz CC: Ross Smith , 'Chuck Allison' , cygwin@cygwin.com Subject: Re: Strange behavior References: <5.1.0.14.2.20020303181544.02707180@pop3.cris.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-03/txt/msg00152.txt.bz2 OK. I'm no IA32 expert can someone explain the following results. (Do the floating point registers use guard bits, randomly initialized perhaps?) bool operator==(const Rational& r1, const Rational& r2) { double a=r1.toDouble(), b=r2.toDouble(); cout << ?== a " << a << " " << ?== b " << b << endl; return a == b; // return r1.toDouble() == r2.toDouble(); /* return ( r1.numerator == r2.numerator && r1.denominator == r2.denominator ); */ } 5/4 == a 1.25 == b 1.25 1 -1/4 == a -0.25 == b -0.25 1 3/8 == a 0.375 == b 0.375 1 2/3 == a 0.666667 == b 0.666667 0 // return r1.toDouble() == r2.toDouble(); 5/4 == a 1.25 == b 1.25 1 -1/4 == a -0.25 == b -0.25 1 3/8 == a 0.375 == b 0.375 1 2/3 == a 0.666667 == b 0.666667 1 return a == b; But since the Rational are always reduced the "right" answer is return ( r1.numerator == r2.numerator && r1.denominator == r2.denominator ); No? Rich. Randall R Schulz wrote: > Ross, > > To call that result "pure luck" denies the fact that digital > computers, when properly functioning, are 100% deterministic. > > Of course, it's not proper floating-point programming, but that > doesn't mean "luck" is involved. > > Randall Schulz > Mountain View, CA USA > > > At 18:04 2002-03-03, Ross Smith wrote: > >> > From: Chuck Allison [mailto:cda@freshsources.com] >> > >> > I have a simple Rational number class and have discovered >> > weird behavior >> > with Cygwin's g++. If you look at the very short main program in file >> > rtest2.cpp, you will see by the output that g++ get's the >> > wrong answer for >> > >> > r1 / r2 == Rational(2,3); // should be true >> > >> > even though it prints as 2/3! Borland and Microsoft get it >> > right. Any ideas? >> > All code atached. >> >> [relevant bit of code] >> >> inline bool operator==(const Rational& r1, const Rational& r2) >> { >> return r1.toDouble() == r2.toDouble(); >> } >> >> This is nothing to do with Cygwin, or g++ for that matter. You're >> comparing floating point numbers. Of course it's not reliable! If >> other compilers happened to give you an exact equality on that >> particular combination of arguments, it was pure luck. > > > > -- > Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple > Bug reporting: http://cygwin.com/bugs.html > Documentation: http://cygwin.com/docs.html > FAQ: http://cygwin.com/faq/ > > -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/