delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2002/03/03/23:50:20

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <3C82FC59.2080700@attbi.com>
Date: Sun, 03 Mar 2002 23:47:21 -0500
From: "Richard R. Malloy" <rrmalloy AT attbi DOT com>
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 <rrschulz AT cris DOT com>
CC: Ross Smith <rosss AT pharos DOT co DOT nz>, "'Chuck Allison'" <cda AT freshsources DOT com>,
cygwin AT cygwin DOT com
Subject: Re: Strange behavior
References: <5 DOT 1 DOT 0 DOT 14 DOT 2 DOT 20020303181544 DOT 02707180 AT pop3 DOT cris DOT com>

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 AT freshsources DOT 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/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019