|
Prev: Submitting a Primitive Library for Peer Review
Next: C++ Memory Management Innovation: GC Allocator
From: C++ Newbie on 21 Apr 2008 03:11 In a C++ exercise, I was asked to find the precision of the variable types float, double and long double. I did it by dividing a starting number by 2 continuously until a logical test detected if there was no discernible difference between successive numbers. Is there a better way to do this? #include <iostream> #include <fstream> using std::cout; using std::cin; using std::fstream; using namespace std; int main() { fstream myfile; myfile.open ("float_test.txt", ios::out); myfile << "floating point number precision test.\n"; int active = 0; float buffer = 1000, float_test = 100, buffer1 = -1; while (active == 0) {float_test = float_test/2.; if (buffer == float_test) { cout << "Lowest float precision is: " << buffer1 << "\n"; system ("tail -2 float_test.txt | head -1 > temp.txt"); myfile.close(); break; } if (buffer > float_test) {//cout << float_test << "\n"; myfile << float_test << "\n"; buffer1 = buffer; buffer = float_test;} } fstream myfile_d; myfile_d.open ("double_test.txt"); myfile_d << "double precision test.\n"; active = 0; double dbuffer = 1000, double_test = 100, dbuffer1 = -1; while (active == 0) {double_test = double_test/2.; if (dbuffer == double_test) { cout << "Lowest double precision is: " << dbuffer1 << "\n"; system ("tail -2 float_test.txt | head -1 > temp.txt"); myfile_d.close(); break; } if (dbuffer > double_test) {//cout << double_test << "\n"; myfile_d << double_test << "\n"; dbuffer1 = dbuffer; dbuffer = double_test;} } fstream myfile_ld; myfile_ld.open ("ldouble_test.txt"); myfile_ld << "long double number precision test.\n"; active = 0; long double ldbuffer = 1000, ldouble_test = 100, ldbuffer1 = -1; while (active == 0) {ldouble_test = ldouble_test/2.; if (ldbuffer == ldouble_test) { cout << "Lowest long double precision is: " << ldbuffer1 << "\n"; system ("tail -2 float_test.txt | head -1 > temp.txt"); myfile_ld.close(); break; } if (ldbuffer > ldouble_test) {//cout << ldouble_test << "\n"; myfile_ld << ldouble_test << "\n"; ldbuffer1 = ldbuffer; ldbuffer = ldouble_test;} } } -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
From: Thomas Richter on 21 Apr 2008 06:39 C++ Newbie wrote: > In a C++ exercise, I was asked to find the precision of the variable > types float, double and long double. > > I did it by dividing a starting number by 2 continuously until a > logical test detected if there was no discernible difference between > successive numbers. Is there a better way to do this? Your algorithm only tests for the minimal possible denormalized exponent, which is unrelated to the precision the types have to offer. Hint: #include <limits> (Otherwise, I'm sorry, but I'm not doing your homework.:-) So long, Thomas -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
From: Jeff Baker on 22 Apr 2008 01:53 "C++ Newbie" <newbie.cpp(a)googlemail.com> wrote in message news:b6b912f8-2a76-4eed-b9dc-8ab1901637a8(a)x41g2000hsb.googlegroups.com... > In a C++ exercise, I was asked to find the precision of the variable > types float, double and long double. > > I did it by dividing a starting number by 2 continuously until a > logical test detected if there was no discernible difference between > successive numbers. Is there a better way to do this? > > #include <iostream> > #include <fstream> > > using std::cout; > using std::cin; > using std::fstream; > using namespace std; don't need namespace std; if you are using using std::/..../; > > > int main() > { > fstream myfile; need ofstream myfile: > myfile.open ("float_test.txt", ios::out); Just need "float_test.txt"); > myfile << "floating point number precision test.\n"; > int active = 0; > float buffer = 1000, float_test = 100, buffer1 = -1; > while (active == 0) > {float_test = float_test/2.; > if (buffer == float_test) > { > cout << "Lowest float precision is: " << buffer1 << "\n"; > system ("tail -2 float_test.txt | head -1 > temp.txt"); > myfile.close(); > break; > } > if (buffer > float_test) > {//cout << float_test << "\n"; > myfile << float_test << "\n"; > buffer1 = buffer; > buffer = float_test;} > } > > fstream myfile_d; > myfile_d.open ("double_test.txt"); > myfile_d << "double precision test.\n"; > active = 0; > double dbuffer = 1000, double_test = 100, dbuffer1 = -1; > while (active == 0) > {double_test = double_test/2.; > if (dbuffer == double_test) > { > cout << "Lowest double precision is: " << dbuffer1 << > "\n"; > system ("tail -2 float_test.txt | head -1 > > temp.txt"); > myfile_d.close(); > break; > } > if (dbuffer > double_test) > {//cout << double_test << "\n"; > myfile_d << double_test << "\n"; > dbuffer1 = dbuffer; > dbuffer = double_test;} > } > > fstream myfile_ld; > myfile_ld.open ("ldouble_test.txt"); > myfile_ld << "long double number precision test.\n"; > active = 0; > long double ldbuffer = 1000, ldouble_test = 100, ldbuffer1 = -1; > while (active == 0) > {ldouble_test = ldouble_test/2.; > if (ldbuffer == ldouble_test) > { > cout << "Lowest long double precision is: " << > ldbuffer1 << "\n"; > system ("tail -2 float_test.txt | head -1 > > temp.txt"); > myfile_ld.close(); > break; > } > if (ldbuffer > ldouble_test) > {//cout << ldouble_test << "\n"; > myfile_ld << ldouble_test << "\n"; > ldbuffer1 = ldbuffer; > ldbuffer = ldouble_test;} > } > > } I don't know the problem you are working on, but I can give it better form from what you have. I derive the same result for float. #include <iostream> #include <fstream> using std::cout; using std::cin; using std::ios; using std::ofstream; int main() { ofstream myfile; myfile.open ("precision_test.txt" ); myfile << "floating point number precision test."<< std::endl; float ff = 1000, buffer = 0; while(ff > 0) { buffer = ff; ff = ff/2; // 2 or 99 if(ff == 0) { std::cout << "Lowest is " << buffer << std::endl; myfile << buffer << std::endl; } } myfile<< "double number precision test."<< std::endl; double fd = 1000,buffer1 = 0; while(fd > 0) { buffer1 = fd; fd = fd/2; if(fd == 0) { std::cout << "Lowest is " << buffer1 << std::endl; myfile << buffer1 << std::endl; } } myfile.close(); } Jeff -- [ See http://www.gotw.ca/resources/clcm.htm for info about ] [ comp.lang.c++.moderated. First time posters: Do this! ]
|
Pages: 1 Prev: Submitting a Primitive Library for Peer Review Next: C++ Memory Management Innovation: GC Allocator |