你能安全地检查无限的标志吗?

时间:2014-09-18 09:52:47

标签: c++ floating-point

过去我们一直在使用Visual Studio的_fpclass来理解无限是积极还是消极: http://msdn.microsoft.com/en-us/library/aa246882%28v=vs.60%29.aspx

传递给std :: fpclassify,正负无限之间没有区别: http://en.cppreference.com/w/cpp/numeric/math/fpclassify

我可以使用其中一种方法安全地检查无限符号吗? Is there a standard sign function (signum, sgn) in C/C++?

注意:

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

注2:

  • C ++ 11适用

4 个答案:

答案 0 :(得分:6)

仅检查无限值的符号(如线程标题中所述),此代码应足够:

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就绪编译器,那么标准库也提供了一个函数,在标题std::signbit中称为<cmath>。它适用于每种基本浮点类型和各种值(因此也适用于无限甚至NaN),因此应该是更通用的解决方案。

答案 1 :(得分:2)

你真的不需要任何特殊功能来检测无穷大和NaN:

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

答案 2 :(得分:0)

以下将测试任何标志:

bool is_positive = std::to_string(x)[0] != '-';

答案 3 :(得分: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
}