From: C++ Newbie on
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
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

"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! ]