From: Warren Young Date: March 25 2009 7:14pm Subject: Re: inserts, strings and setprecision List-Archive: http://lists.mysql.com/plusplus/8510 Message-Id: MIME-Version: 1.0 (Apple Message framework v930.3) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit On Mar 25, 2009, at 3:50 AM, Ken Smith wrote: > The file format and the API I'm using to read it (FITS) supports > IEEE 754, and, as far as I know, so does C++ and MySQL (with the > exception of NaN values). I just (perhaps naively) want to take > those numbers from the file and store them in the database without > parsing them as strings. Sure, the *capability* is there, but someone has to write the code to make it happen. If you can't wait for me to get to it on my schedule, well, it's an open source project; we accept patches. Study the code, make a proposal about where you think your feature fits in with the library, and we'll be happy to help you refine your ideas into something that will work within the context of the current MySQL++ design. >> This really isn't a MySQL++ issue. It's an FP issue. > > I've tested the precision, and MySQL++ doesn't set it > automatically. I had to force it using setprecision. How are you building your query strings, exactly? Post a code snippet, please. Or, better, post a short (< 50 LOC) program that can build on any system using only MySQL++, which demonstrates the problem. Give the details of the machine and compiler, in case those are relevant. As Jim said, all paths for building a query string with an FP value should pass through one of the four SQLTypeAdapter ctors taking FP values. There are several things that could be going wrong, but without code to demonstrate a flaw, it's hard to see what it could be. > However inaccurate the measurements, at least I could say with > confidence that the process of data ingestion has not further > altered the data. Unless we find that MySQL++ is indeed truncating meaningful digits from your data, I think you're worrying about altering noise in your signals, producing different noise. This is meaningless. Also, realize that modern CPUs have very mature FPUs. They're designed with scientific applications in mind, and have features to preserve as much useful precision as possible. Much of the worries about FP precision these days are residual FUD from the 70s, when machines either had weak FPUs or people had to roll their own FP routines, often poorly. I tried to write a program to force an FP error, but failed. Here's my attempt: #include #include #include using namespace std; int main() { // Convert a million degrees F to C, traditional way double f = (1e6 - 32.0) * (5.0 / 9.0); cout << setprecision(17) << f << endl; // Do it again, but in a way less likely to lose precision f = (1e6 - 32.0) * 5.0 / 9.0; cout << setprecision(17) << f << endl; // Convert f to a string, then back to double, and print it again ostringstream outs; outs << setprecision(17) << f; std::stringstream buf; buf.write(outs.str().data(), outs.str().length()); cout << setprecision(17) << f << endl; return 0; } All three outputs are the same on a bunch of different systems here: CPUs: x86, x86_64, PowerPC G5 OSes: OS X 10.5.6, CentOS 3, 4 and 5, OpenSolaris 2008.11, and Windows XP SP3 Compilers: Visual C++ and many variants of g++ This code duplicates the way MySQL++ does its FP-to-string and string- to-FP conversions.