There's a difference between GCC and MS Visual Studio 2008 Express. GCC works fine. But Visual Studio shows this problem. The difference comes in this section of code where the rounding error during computation is different. if( realvalue>0.0 ){
while( realvalue>=1e32 && exp<=350 ){ realvalue *= 1e-32; exp+=32; } while( realvalue>=1e8 && exp<=350 ){ realvalue *= 1e-8; exp+=8; } while( realvalue>=10.0 && exp<=350 ){ realvalue *= 0.1; exp++; } while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } } Then it makes the mistake here in rounding if( xtype!=etFLOAT ){ realvalue += rounder; if( realvalue>=10.0 ){ realvalue *= 0.1; exp++; } } The first section rounds different when running the two of the while loops Gcc ends up with 8.9484710000000032 MS ends up with 8.9484710000000049 Then the rounder takes them to Gcc: 8.9484710000000085 MS: 8.9484710000000103 So that's where your round error is. I assume you're using a Microsoft product to compile? I think the actual fix is to change the two %!.15g entries to %!.14g It's a common misconception that double precision is 15 digits to the right of the decimal point. That's incorrect. It's 15 significant digits TOTAL regardless of the location of the decimal point. By using 15g you're actually showing 16 significant digits and double-precision actually has 15.95 significant digits so you'll hit rounding errors with 16. I find it interesting though that the math is different between the two compilers...I wonder which is actually "correct" ?? Michael D. Black Senior Scientist Advanced Analytics Directorate Northrop Grumman Information Systems ________________________________ From: sqlite-users-boun...@sqlite.org on behalf of Rick Regan Sent: Sat 11/27/2010 11:09 AM To: sqlite-users@sqlite.org Subject: EXTERNAL:[sqlite] Some floats of 15 digits or less do not round-trip I expected floats of 15 significant decimal digits or less to round-trip: sqlite> create table t1(d float); sqlite> insert into t1 values(8.948471e15); sqlite> select * from t1; 8.94847100000001e+15 The double value stored in the database is correct (I traced the code and printed the value of 'realvalue' in sqlite3VXPrintf()) -- it's 0x1.fca96433ce600p+52 = 11111110010101001011001000011001111001110011000000000 = 8948471000000000 = 8.948471e15. In other words, the original decimal to floating-point conversion was done correctly, but the floating-point to decimal conversion was not. (This is different than the issue of bug http://www.sqlite.org/src/tktview?name=1248e6cda8 .) Rick Regan -- Check out my blog: http://www.exploringbinary.com <http://www.exploringbinary.com/> _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users