Xref: news2.mv.net comp.lang.c:54752 comp.lang.c++:70293 comp.os.msdos.djgpp:730 gnu.g++.help:4466 gnu.gcc.help:5672 From: Roland Exler Newsgroups: comp.lang.c,comp.lang.c++,gnu.gcc.help,gnu.g++.help,comp.os.msdos.djgpp Subject: Re: float != float and floats as return types Date: 1 Feb 1996 07:40:13 GMT Organization: Institute for el. Measurement, University of Linz, Austria Lines: 49 Message-ID: <4epqot$fj1@alijku06.edvz.uni-linz.ac.at> References: <4ej9lb$mpc AT fu-berlin DOT de> NNTP-Posting-Host: sensor4.emt.uni-linz.ac.at To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp axl AT zedat DOT fu-berlin DOT de (Axel Thimm) wrote: >The next C++ example gives me surprising results: > #include > #include > #include > float quad( float ); > int main() { > for( int i=0; i<10; ++i ) { > float a, b, c; > a = i/13.123123; > b = a*a; > c = quad(a); > cout << (b - c) << '\t'; > cout << (b - a*a) << '\t'; > cout << (c - quad(a)) << '\n'; > } > return 0; > } > float quad( float x ) { return x*x; } >At first I thought all numbers should be zeros. The middle column might >not be zero, if the compiler calculates in higher precision than what >the variables are, so an intermediate storage (b) might loose some >digits, but I cannot understand what happens with c! Both times a >function is called, that _is_not_ inlined, so in both cases the same >loss of digits should be observed. >Any ideas? Hi Axel, Maybe the result of quad is returned on the coprocessor-stack, so it's uses with the full precicion even if the result is declared as float. (The coprocessor does _all_ computations using double or extended dependend on an internal flag.) In this case all floating-point results are truncated only if _stored_ to a var with less precicion. If you want to see more compile your program with gcc -c t_prec -save-temps and take a look on the file t_prec.s (the assembler-output for your program). Roland +---------------------------------------+---------------------------+ I Roland Exler I EMAIL: I I Universitaet Linz I R DOT Exler AT jk DOT uni-linz DOT ac DOT at I I Institut fuer Elektrische Messtechnik I I I Altenbergerstr. 69 I Phone: I I A-4040 Linz, AUSTRIA I + 43 732 2468 9205 I +---------------------------------------+---------------------------+