X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Authentication-Results: msg-ironport2.usc.edu; dkim=neutral (message not signed) header.i=none X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhYFAM9pM0tEtcka/2dsb2JhbACQFAG3S4UCiBiEMwQ Date: Thu, 24 Dec 2009 13:19:12 -0800 (PST) From: Linh Phan Message-Id: <200912242119.nBOLJCr7019530@aludra.usc.edu> To: cygwin AT cygwin DOT com Subject: floating-point math problem in Cygwin 1.7? Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com 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: 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. Thanks, Linh -- 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