Dear list,
I find it hard to believe, but it seems that the SIN() and COS()
built-ins might be broken in gfortran on mipsel. See this build log for
instance, search in it for the string "Testing Routine B101" and look at
the table following that string:
http://buildd.debian.org/fetch.cgi?&pkg=cernlib&ver=2006.dfsg.2-12&arch=mipsel&stamp=1205698992&file=log
Judging by this build log, the SIN(x) and COS(x) functions on mipsel
apparently return 0 and 1 respectively for x > 0 (and do not give the
right values even for x = 0).
Unfortunately, as far as I know there are no currently available
mips/mipsel machines for developers to use, so I need to ask this list
for help. I'm attaching a stand-alone version of this test as file
"sincos.F". If someone running the latest Sid on a mipsel architecture
wouldn't mind, please install the latest gfortran-4.3 package, run the
following and see what you get:
gfortran-4.3 -O2 sincos.F -o a.out
./a.out
What you *should* get is something like the following: (obviously the
exact errors will vary depending on floating point variations, but
should be less than 1.0E-07)
For A=I*PI/180:
I X=SIN(A) Y=COS(A) ATG(X,Y) Error
0 0.0000000 1.0000000 0.0000000 0.0E+00
10 0.1736482 0.9848077 0.1745329 0.9E-07
20 0.3420202 0.9396926 0.3490659 0.0E+00
[snip]
Largest Error for ATG was 0.9E-07
If the same bug as seen in the cernlib build log manifests itself, you
will get something more like this:
For A=I*PI/180:
I X=SIN(A) Y=COS(A) ATG(X,Y) Error
0 0.9869969 0.1607389 1.4093571 0.0E+00
10 0.0000000 1.0000000 0.0000000 0.1E+01
20 0.0000000 1.0000000 0.0000000 0.1E+01
[snip]
Largest Error for ATG was 0.1E+01
Please let me know (CC: to my email address) what is actually obtained
on mipsel (and also on big-endian mips if possible).
If you do get results significantly different from those shown above,
please try compiling at lower optimization levels down to -O0 and see
whether any of them give the correct results.
Thank you and best regards,
--
Kevin B. McCarty <kmccarty@gmail.com>
WWW: http://www.starplot.org/
WWW: http://people.debian.org/~kmccarty/
GPG: public key ID 4F83C751
PROGRAM B101M
C Specify the largest error allowed for a successful test
PARAMETER ( TSTERR=1D-6 )
WRITE(6,'(/8X,''For A=I*PI/180:'')')
WRITE(6,'(/5X,''I'',3X,''X=SIN(A)'',4X,''Y=COS(A)'',8X,
+ ''ATG(X,Y)'',4X,''Error'')')
ER=0E0
ERMAX=0E0
PI = 3.14159 26535 89793D0
DO 1 I = 0,350,10
A=I*PI/180
X1=SIN(A)
X2=COS(A)
R1=ATG(X1,X2)
IF (A .NE. 0.)ER=ABS((R1-A)/A)
ERMAX=MAX(ERMAX,ER)
WRITE(6,'(1X,I5,2F12.7,F15.7,E10.1)') I,X1,X2,R1,ER
1 CONTINUE
WRITE(6,'(/7X,''Largest Error for ATG was'',E10.1)')ERMAX
END
FUNCTION ATG(X1,X2)
PARAMETER (PI = 3.14159 26535 89793D0)
ATG=ATAN2(X1,X2)+(PI-SIGN(PI,X1))
RETURN
END
Attachment:
signature.asc
Description: OpenPGP digital signature