你能安全地检查无穷大的符号吗
Can you safely check the sign of infinite?
过去,我们一直在使用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
是正无穷大还是负无穷大,只是不知道是哪一个。在这种情况下,如果你知道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
}
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 检查TCHAR数组输入是否为带符号整数C++
- 用符号版本替换对函数的所有调用
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何打印boost多精度128位无符号整数
- 你能安全地检查无穷大的符号吗
- 我想实现一种数据类型,它可以在c++中接受整数值加上一个无穷大符号