c++ - 你能安全地检查无穷大的符号吗?

标签 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 适用

最佳答案

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

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),因此应该是一个更通用的解决方案。

关于c++ - 你能安全地检查无穷大的符号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25909494/

相关文章:

c++ - MinGW 中的全局重载运算符 new/delete

c++ - 如何在C中按顺序对带有数字和字母的文件名进行排序?

c++ - 将小部件大小设置为另一个大小的一半

c++ - 为什么 c 中地址的值总是偶数?

c++ - 32 位数字的十六进制表示

c++ - c++ 有等效的 boost::numeric_cast<DestType>(SourceType) 吗?

c# - 在 C# 中使用 sql float 的 Nhibernate float 问题

c++ - 使用 boost::iostreams 读取特制数据,然后基于该创建对象并将其附加到列表

math - float 学坏了吗?

c++ - stof、strtof是确定性的吗?