The normal signbit function of gcc without the -std=c99 flag doesn't work
correctly for nans and infs. I found the following code on a boost mailing
list and it might be helpful here for portability.

const boost::uint32_t signbit_mask
     = binary_cast<boost::uint32_t>(1.0f)
     ^ binary_cast<boost::uint32_t>(-1.0f);

inline bool signbit(float x)
{
     return binary_cast<boost::uint32_t>(x) & signbit_mask;
}

inline bool signbit(double x)
{
     return signbit(static_cast<float>(x));
}
inline bool signbit(long double x)
{
     return signbit(static_cast<float>(x));
}

Which is rather clever. I think binary_cast will require some pointer abuse.
There are a bunch of other boost functions here
<http://tinyurl.com/3tvj9u>that might prove useful. This file

 <goog_1222871357985>floating_point_utilities_v3.zip
<http://www.boostpro.com/vault/index.php?action=downloadfile&filename=floating_point_utilities_v3.zip&directory=Math%20-%20Numerics&PHPSESSID=64b789bb8092caa29b11839ec7526611>
portable isnan, fpclassify, signbit etc. + facets for portable handling of
infinity and NaN in text streams

Looks particularly interesting. It's a bit large for the mailing list so I
won't attach it. The Boost license should be compatible with numpy.

Chuck
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@scipy.org
http://projects.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to