delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2008/08/04/10:30:07

X-Recipient: archive-cygwin AT delorie DOT com
X-Spam-Check-By: sourceware.org
X-SBRS: 3.6
X-IronPort-AV: E=Sophos;i="4.31,304,1215414000"; d="scan'208";a="44759190"
From: Richard Stanton <stanton AT haas DOT berkeley DOT edu>
To: "cygwin AT cygwin DOT com" <cygwin AT cygwin DOT com>
Date: Mon, 4 Aug 2008 07:29:14 -0700
Subject: Re: cygwin gcc: Different numerical results in thread vs in main()
Message-ID: <40C7B1BFC291ED4E9D10436D07736A33127AB73CD1@EXMAIL7.haas.uc.berkeley.edu>
Accept-Language: en-US
acceptlanguage: en-US
MIME-Version: 1.0
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id m74EU6Jd016882

Thanks for the helpful information, David. Oddly, -ffloat-store doesn't seem to make any difference:

[c:\projects\threads]gcc -ffloat-store -o thread1 thread1.c -lpthread

[c:\projects\threads]thread1
Main:     t/1+t =    0.0005609048868329022342546
Thread 0: t/1+t =    0.0005609048868329021258344
Thread 1: t/1+t =    0.0005609048868329021258344
Thread 2: t/1+t =    0.0005609048868329021258344
Thread 3: t/1+t =    0.0005609048868329021258344

-----Original Message-----
From: Billinghurst, David (RTATECH) [mailto:David DOT Billinghurst AT riotinto DOT com]
Sent: Sunday, August 03, 2008 10:16 PM
To: Richard Stanton
Subject: RE: cygwin gcc: Different numerical results in thread vs in main()

Try compiling with -ffloat-store then report back.   google for
"float-store excess precision gcc" to understand why this may help.

I don't recommend -ffloat-store as a fix, but it can help diagnose the problem.

David

> -----Original Message-----
> From: cygwin-owner AT cygwin DOT com
> [mailto:cygwin-owner AT cygwin DOT com] On Behalf Of Richard Stanton
> Sent: Monday, 4 August 2008 15:03
> To: cygwin AT cygwin DOT com
> Subject: cygwin gcc: Different numerical results in thread vs in
> main()
>
> The following program performs exactly the same calculation 5 times,
> once inside main(), and again in 4 thread functions.
> Though the calculations are identical, the results are not.
> When I compile and run the same program on my Mac, all the results are
> identical. By the way, this is using the latest gcc 3.4.4.
>
> Richard Stanton
>
> ------------------
>
> [c:\projects\threads]thread1
> Main:        t/1+t =    0.0005609048868329022342546
> Thread 0: t/1+t =    0.0005609048868329021258344
> Thread 1: t/1+t =    0.0005609048868329021258344
> Thread 2: t/1+t =    0.0005609048868329021258344
> Thread 3: t/1+t =    0.0005609048868329021258344
>
>
> #include <stdio.h>
> #include <pthread.h>
>
> #define NUM_THREADS 4
>
> double t =  0.0005612196776927068104374;
>
> void * thread_function (void *arg)
> {
>     int i;
>     int id = *((int *)arg);
>
>     printf("Thread %d: t/1+t = %30.25lf\n", id, t/(1.0+t));
>
>     return NULL;
> }
>
>
> int main()
> {
>         int i;
>         int arg[NUM_THREADS] = {0,1,2,3};
>         pthread_t thread[NUM_THREADS];
>         pthread_attr_t attr;
>
>         printf("Main:     t/1+t = %30.25lf\n", t/(1.0+t));
>
>         /* initialize and set the thread attributes */
>         pthread_attr_init( &attr );
>         pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
>
>         /* creating threads */
>         for ( i=0; i<NUM_THREADS; i++ ) {
>             if ( pthread_create( &thread[i], &attr, thread_function,
> (void *)&arg[i] )) {
>                 fprintf(stderr,"Creating thread %d failed!",i);
>                 return 1;
>             }
>         }
>
>         /* joining threads (== waiting for them to exit) */
>         for ( i=0; i<NUM_THREADS; i++ ) {
>             if ( pthread_join ( thread[i], NULL ) ) {
>                 fprintf(stderr,"Joing thread %d failed!",i);
>                 return 1;
>             }
>         }
>
>         return 0;
> }


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.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