------- Additional Comments From falk at debian dot org 2005-09-09 10:07
-------
(In reply to comment #0)
> There are many reasons. (One and the best is to switch a double based on
> intervals) Therefore I would like a VERY FAST FUNCTION to return the sign of a
> double (and float and long double) ...
>
> (And compare on a double d<=-0.0 (without branch) wont do the trick. And I
> can't
> blame you because you will have to respect Nan.
>
> Since c/c++ does not have this fast function (skipping Nan)
> (which I hope will come) I have no other no other options that to
> write it myself (and cheat!)
C99 has this function; it's called signbit. So you should use that.
Newer gcc's also have a __builtin_signbit function.
> The code with the bug is : (Read signbit a push it to be one or zero)
> int is_not_positive(double v)
> {
> return ((reinterpret_cast<unsigned int*>(&v)[1]) >> 31);
> }
This code has undefined behavior, since it violates aliasing rules.
You should use a union, if you absolutely have to do it this way.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23793