This is the mail archive of the
cygwin
mailing list for the Cygwin project.
R: floating-point math problem in Cygwin 1.7?
- From: Marco Atzeri <marco_atzeri at yahoo dot it>
- To: cygwin at cygwin dot com, Linh Phan <linhphan at usc dot edu>
- Date: Fri, 25 Dec 2009 06:16:47 +0000 (GMT)
- Subject: R: floating-point math problem in Cygwin 1.7?
--- Gio 24/12/09, Linh Phan ha scritto:
> Hi,
>
> Â I have wondering why when I do floating-point math
> in Cygwin 1.7, Cygwin does not output the "correct" result,
> eg:
>
> main () {
> Â double qcb[4] = {0.41585680180318363,
> 0.70823637211274604, 0.089200955545759006,Â
> -0.56347808399291521};
> Â double qba[4] = {0.09648538897087118,
> -0.37032037362514358,
> 0.89403246842889339,ÂÂÂ0.23293633462432001};
> Â double qca[4];
>
> Â qca[0]= qcb[3]*qba[0] + qcb[2]*qba[1] -
> qcb[1]*qba[2] + qcb[0]*qba[3];
> Â qca[1]= -qcb[2]*qba[0] + qcb[3]*qba[1] +
> qcb[0]*qba[2] + qcb[1]*qba[3];
> Â qca[2]= qcb[1]*qba[0] - qcb[0]*qba[1] +
> qcb[3]*qba[2] + qcb[2]*qba[3];
> Â qca[3]= -qcb[0]*qba[0] - qcb[1]*qba[1] -
> qcb[2]*qba[2] + qcb[3]*qba[3];
>
> Â // I am expecting the result to be:
>
> Â printf("qca = [-0.623718486146499718,
> 0.736824293298044886, -0.260654850643024127,
> 0.011147182658310384] CORRECT (LINUX/SOLARIS)\n");
>
> Â // I get the above result on both Linux/Solaris AND
> even when running under Cygwin's gdb and using gdb's printf
>
> Â // but when I compile and run on cygwin, I get the
> wrong result:
s/wrong/different
> Â printf("qca = [%.18f, %.18f, %.18f, %.18f] NOT
> CORRECT (CYGWIN)\n",qca[0],qca[1],qca[2],qca[3]);
> }
>
> Here is the output when I compiled and run on cygwin:
>
> qca = [-0.623718486146499718, 0.736824293298044886,
> -0.260654850643024127, 0.011147182658310384] CORRECT
> (LINUX/SOLARIS)
> qca = [-0.623718486146499607, 0.736824293298044886,
> -0.260654850643024072, 0.011147182658310373] NOT CORRECT
> (CYGWIN)
>
> Here's the output when running under cygwin's gdb (it
> matches Linux/Solaris outputs but not cygwinâs output):
>
> (gdb) printf "%.18f\n", qcb[3]*qba[0] + qcb[2]*qba[1] -
> qcb[1]*qba[2] + qcb[0]*qba[3]
> -0.623718486146499718
> (gdb) printf "%.18f\n", -qcb[2]*qba[0] + qcb[3]*qba[1] +
> qcb[0]*qba[2] + qcb[1]*qba[3]
> 0.736824293298044886
> (gdb) printf "%.18f\n", qcb[1]*qba[0] - qcb[0]*qba[1] +
> qcb[3]*qba[2] + qcb[2]*qba[3]
> -0.260654850643024127
> (gdb) printf "%.18f\n", -qcb[0]*qba[0] - qcb[1]*qba[1] -
> qcb[2]*qba[2] + qcb[3]*qba[3]
> 0.011147182658310384
> (gdb)
>
> These errors accumulate and eventually builds up so much
> that the my simulation result is totally wrong when running
> under cygwin.
>
> Please help.Â
I will bet
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
see
http://hal.archives-ouvertes.fr/hal-00128124
for further detailed info on rounding
if so it is not a bug is a feature
:-)
by the way on (cygwin) octave that round as you expect I have
printf("%.18g\n",qca)
-0.623718486146499718
0.736824293298044886
-0.260654850643024127
0.0111471826583103839
> Thanks,
>
> Linh
>
Marco
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple