Message-ID: <3AFC71C1.D3CDF864@jps.net> From: Dennis Yelle X-Mailer: Mozilla 4.75 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: cout ignores the last 11 bits of long double Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 84 Date: Fri, 11 May 2001 16:12:01 -0700 NNTP-Posting-Host: 216.119.26.22 X-Complaints-To: abuse AT onemain DOT com X-Trace: nntp1.onemain.com 989622499 216.119.26.22 (Fri, 11 May 2001 19:08:19 EDT) NNTP-Posting-Date: Fri, 11 May 2001 19:08:19 EDT To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Here is the program: #include #include #include long double f( long double x) { return pow( double(x), double( x*x*x)); } void dump( long double x) { unsigned char* p = (unsigned char*)&x; printf( "hex: "); for( int i=10; --i >=0; ) printf( "%02x", p[i]); printf( "\n"); } void show( long double x) { dump(x); cout.precision(41); cout << "cout: " << x << '\n'; printf( "printf: %.40Lf\n", x); } void doit( long double low, long double high) { for( int i=0; i<90; i++) { long double mid = low + (high-low)/2; cout << '\n'; cout << "i: " << i << ':' << '\n'; show( mid); if ( mid == low) break; if ( f( mid) < 3 ) low = mid; else high = mid; } } int main() { doit( 1, 2); } ============= Here is part of the results: i: 51: hex: 3fffb89ba24891f7b800 cout: 1.4422495703074085238171164746745489537716 printf: 1.4422495703074085238171164746745489537720 i: 52: hex: 3fffb89ba24891f7b400 cout: 1.4422495703074083017725115496432408690453 printf: 1.4422495703074084127948140121588949114080 -------------------------^^^^^^^^^^^^^^^^^^^^^^^^^ i: 53: hex: 3fffb89ba24891f7b600 cout: 1.4422495703074085238171164746745489537716 printf: 1.4422495703074084683059652434167219325900 -------------------------^^^^^^^^^^^^^^^^^^^^^^^^^ i: 54: hex: 3fffb89ba24891f7b500 cout: 1.4422495703074085238171164746745489537716 printf: 1.4422495703074084405503896277878084219990 -------------------------^^^^^^^^^^^^^^^^^^^^^^^^^ Notice that the cout result for i: 53 is the same as for i: 51, but the printf result is different. It looks like cout operator<< ignores the last 11 bits of a long double. Dennis Yelle -- I am a computer programmer and I am looking for a job. There is a link to my resume here: http://table.jps.net/~vert/