Date: Sat, 15 Sep 2012 08:39:22 -0700 From: Mehmet Erol Sanliturk <m.e.sanliturk@gmail.com> To: Tijl Coosemans <tijl@coosemans.org> Cc: Ian Lepore <freebsd@damnhippie.dyndns.org>, current@freebsd.org, Roman Divacky <rdivacky@freebsd.org>, Dimitry Andric <dim@freebsd.org>, toolchain@freebsd.org, Steve Kargl <sgk@troutmask.apl.washington.edu> Subject: Re: Clang as default compiler November 4th Message-ID: <CAOgwaMvtSXoGCYnX%2BA3DzMffXo6mhHk=EWWO=1k7SWuAiH21xg@mail.gmail.com> In-Reply-To: <505490FB.2000807@coosemans.org> References: <504F5101.8090906@FreeBSD.org> <505101C3.70203@freebsd.org> <20120913020833.GA8255@troutmask.apl.washington.edu> <1347550332.1110.108.camel@revolution.hippie.lan> <20120913161024.GA13846@troutmask.apl.washington.edu> <20120914202319.GB5244@lor.one-eyed-alien.net> <20120915001808.GA70215@troutmask.apl.washington.edu> <20120915010600.GA70426@troutmask.apl.washington.edu> <20120915124809.GA10939@freebsd.org> <50548736.9030203@coosemans.org> <20120915140933.GA17801@freebsd.org> <505490FB.2000807@coosemans.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Sep 15, 2012 at 7:30 AM, Tijl Coosemans <tijl@coosemans.org> wrote:
> On 15-09-2012 16:09, Roman Divacky wrote:
> > Is this correct?
> >
> > lev ~$ ./cos 1.23456789e20
> > 6.031937e-01
> > -9.629173e-02
> > 2.814722e-01
>
> Yes, that's what the libm call returns.
>
>
Linux z 3.5.3-1.fc17.x86_64 #1 SMP Wed Aug 29 18:46:34 UTC 2012 x86_64
x86_64 x86_64 GNU/Linux
clang version 3.0 (tags/RELEASE_30/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
Output of the initial program is the following :
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main( int argc, char **argv ) {
double d = strtod( argv[ 1 ], NULL );
printf( " cos : %e\n", ( double ) cos( d ));
printf( "cosf : %e\n", ( double ) cosf( d ));
printf( "cosl : %e\n", ( double ) cosl( d ));
return( 0 );
}
cos : 2.814722e-01
cosf : -9.629173e-02
cosl : 7.738403e-01
.......................................................
Output of the following program is different :
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main( int argc, char **argv ) {
double d ;
double two_pi ;
double f ;
double v ;
two_pi = 2 * 3.14159265358979323846 ;
d = strtod( argv[ 1 ], NULL );
f = floor ( d / two_pi ) ;
v = d - f * two_pi ;
printf( " given : %e\n", ( double ) d );
printf( " multiplier : %e\n", ( double ) f );
printf( "reduced : %e\n", ( double ) v );
printf( " cos ( %e ) : %e\n", d , ( double ) cos( d ));
printf( "cosf ( %e ) : %e\n", d , ( double ) cosf( d ));
printf( "cosl ( %e ) : %e\n", d , ( double ) cosl( d ));
printf( " cos ( %e ) : %e\n", v , ( double ) cos( v ));
printf( "cosf ( %e ) : %e\n", v , ( double ) cosf( v ));
printf( "cosl ( %e ) : %e\n", v , ( double ) cosl( v ));
return( 0 );
}
given : 1.234568e+20
multiplier : 1.964876e+19
reduced : 1.638400e+04
cos ( 1.234568e+20 ) : 2.814722e-01
cosf ( 1.234568e+20 ) : -9.629173e-02
cosl ( 1.234568e+20 ) : 7.738403e-01
cos ( 1.638400e+04 ) : -8.285342e-01
cosf ( 1.638400e+04 ) : -8.285342e-01
cosl ( 1.638400e+04 ) : -8.285342e-01
.......................................................
Reduction of argument once more did NOT change results :
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int
main( int argc, char **argv ) {
double d ;
double two_pi ;
double f ;
double v ;
double g ;
double w ;
two_pi = 2 * 3.14159265358979323846 ;
d = strtod( argv[ 1 ], NULL );
printf( " given : %e\n", ( double ) d );
printf( " cos ( %e ) : %e\n", d , ( double ) cos( d ));
printf( "cosf ( %e ) : %e\n", d , ( double ) cosf( d ));
printf( "cosl ( %e ) : %e\n", d , ( double ) cosl( d ));
f = floor ( d / two_pi ) ;
v = d - f * two_pi ;
printf( "multiplier : %e\n", ( double ) f );
printf( " reduced : %e\n", ( double ) v );
printf( " cos ( %e ) : %e\n", v , ( double ) cos( v ));
printf( "cosf ( %e ) : %e\n", v , ( double ) cosf( v ));
printf( "cosl ( %e ) : %e\n", v , ( double ) cosl( v ));
g = floor ( v / two_pi ) ;
w = v - g * two_pi ;
printf( "multiplier : %e\n", ( double ) g );
printf( " reduced : %e\n", ( double ) w );
printf( " cos ( %e ) : %e\n", w , ( double ) cos( w ));
printf( "cosf ( %e ) : %e\n", w , ( double ) cosf( w ));
printf( "cosl ( %e ) : %e\n", w , ( double ) cosl( w ));
return( 0 );
}
given : 1.234568e+20
cos ( 1.234568e+20 ) : 2.814722e-01
cosf ( 1.234568e+20 ) : -9.629173e-02
cosl ( 1.234568e+20 ) : 7.738403e-01
multiplier : 1.964876e+19
reduced : 1.638400e+04
cos ( 1.638400e+04 ) : -8.285342e-01
cosf ( 1.638400e+04 ) : -8.285342e-01
cosl ( 1.638400e+04 ) : -8.285342e-01
multiplier : 2.607000e+03
reduced : 3.735904e+00
cos ( 3.735904e+00 ) : -8.285342e-01
cosf ( 3.735904e+00 ) : -8.285342e-01
cosl ( 3.735904e+00 ) : -8.285342e-01
.......................................................
Thank you very much .
Mehmet Erol Sanliturk
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAOgwaMvtSXoGCYnX%2BA3DzMffXo6mhHk=EWWO=1k7SWuAiH21xg>
