Re: Code crashes at runtime - is this valid c++
On Nov 6, 11:22 pm, Salt_Peter <pj_h...@yahoo.com> wrote:
On Nov 6, 2:59 pm, chrisstankev...@gmail.com wrote:
Compile with:
g++ crash.cpp -O2
Crashes on:
g++ (Gentoo 4.3.2 p1.1) 4.3.2
g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)
g++ (ubuntu current stable)
I can't reproduce it on any of the systems I have available
here. (Solaris on Sparc, with g++ 4.1.0 or Sun CC 5.8; Linux
2.6.9 on Intel, with g++ 4.1.0, and Windows XP with VC++ 14).
Of course, for all but Linux, I had to modify the code to get it
to compile.
Steps to reproduce:
1. Make a file crash.cpp (contents below)
2. g++ crash.cpp -O2
3. ./a.out
Floating point exception
Source:
#include <iostream>
#include <fenv.h>
This header is not standard C++, and is only available if you
have C99 as well. (Which means that I would normally expect it
pretty much everywhere---but my expectations are disappointed;
it's present neither under Solaris nor Windows.)
float g(const float& x)
{
float y = x;
if(y == 0.0f)
Never compare 2 floats for equality.
Which is very poor advice. In this particular case, comparison
for equality is exactly what he wants.
Apart from the fact that its an intensive operation for a cpu,
Since when? It's as fast as any other comparison, integral or
floating point, on the machines available to me.
the following is expected...
#include <iostream>
int main()
{
float fa(0.0f);
float fb(0.0f);
if( fa == fb)
std::cout << "not equal\n";
else
std::cout << "equal\n";
std::cout << "Press ENTER to EXIT.\n";
std::cin.get();
}
/*
not equal
*/
Are you kidding? Any compiler which outputs "not equal" with
that program is seriously broken.
{
y=1.0f;
}
return x/y;
}
void f(const float &z)
{
if (z > 0.0f)
z might be 0.0000000001f
And z might be -0.000000001f. Or 1e30. Or anything else. The
whole point is that he doesn't know, and that he doesn't want to
divide by zero. The only correct test is thus:
if ( z != 0.0F )
Anything else is a programming error, and shows a complete lack
of understanding of how machine floating point works.
Note that in his actual code, the function is only called with z
equal 130.0. Which can't be 0.0, anyway you cut it, and will
always be greater than 0.0. (For that matter, I don't know of a
machine where it won't be represented exactly.)
{
float Unit2 = g(z);
std::cout << Unit2;
}
}
int main()
{
feenableexcept(FE_INVALID);
float a = 130.0f;
f(a);
return 0;
}
For the original poster: does adding the option -ffloat-store
have any effect? G++ isn't fully standards compliant without
it. Not that I think that it could affect your program; all of
the values you use are exactly representable. (It could affect
the program if the value you are comparing with 0.0 is the
result of an expression, and in some strange way, the compiler
picks it up from a register in the comparison, but reloads it
from memory for the division. And the actual real intermediate
results were smaller than 1E-38.) For Intel processors, g++
also accepts -mpc64 and -mpc32, which cause all intermediate
values to be rounded to 64 or 32 bits---this will not only
eliminate excess precision in the intermediate values, but may
also run a little bit faster (particularly on older hardware.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34