过去我们一直在使用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++?
注意:
注2:
答案 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
是正无穷大或负无穷大,只是不知道哪个。在这种情况下,如果您知道x
是7
或-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
}