你能安全地检查无穷大的符号吗

Can you safely check the sign of infinite?

本文关键字:符号 无穷大 检查 安全      更新时间:2023-10-16

过去,我们一直在使用Visual Studio的_fpclass来了解无穷大是正还是负:http://msdn.microsoft.com/en-us/library/aa246882%28v=vs.60%29.aspx

传递到std::fpcategory,正无穷大和负无穷大之间不再有区别:http://en.cppreference.com/w/cpp/numeric/math/fpclassify

我可以用这里的一个方法安全地检查无穷大的符号吗
C/C++中有标准的符号函数(signum,sgn)吗?

注:

  • 如果启用了fastmath,则独立
  • 以便携方式

注2:

  • C++11适用

对于只检查无限值的符号(如线程标题中所述),以下代码应该足够了:

template<typename T>
typename std::enable_if<std::numeric_limits<T>::has_infinity, bool>::type Signed(T const& Value)
{
    return Value == -std::numeric_limits<T>::infinity();
}

编辑:如果您可以访问一个支持C++11的编译器,那么还有一个由标准库提供的函数,在头<cmath>中称为std::signbit。它适用于每一种基本浮点类型和每一种值(对于无穷大甚至NaN也是如此),因此应该是一个更通用的解决方案。

您实际上不需要任何特殊的函数来检测无穷大和NaNs:

double x = ...;
bool is_nan = x != x;
bool is_finite = !is_nan && x != 2 * x;
bool is_negative = !is_nan && x < 0;

您似乎已经知道x是正无穷大还是负无穷大,只是不知道是哪一个。在这种情况下,如果你知道x7-7,但不知道是哪个,你会使用相同的策略:

x > 0

这没什么错。当然,x > 24或与任何其他有限值的比较都是有效的,因为正无穷大大于所有有限值,负无穷大小于所有有限值。但与0的比较似乎是检查符号的最可读的方式。

如果你不确定x是否是无穷大,那么就明确地测试它,正如Fytch的答案所建议的那样:

if (x == std::numeric_limits<double>::infinity()) {
    // positive infinity
} else if (x == -std::numeric_limits<double>::infinity()) {
    // negative infinity
} else {
    // something else
}