为什么numeric_limits <int> :: max()> numeric_limits <int> :: infinity()?

leg*_*s2k 24 c++ integer limits numeric integral

我正在阅读在C++中将int设置为Infinity.我明白,当一个人需要真正的无限时,一个人应该使用numeric_limits<float>::infinity(); 我猜的理由背后是通常整型已指定为用于表示如特殊状态没有价值的NaN,天道酬勤,像等IEEE 754个浮动不(再C++不强制要求既不- intfloat使用都留给实现); 但max > infinity对于给定的类型,它仍然是误导性的.我试图理解标准中这个调用背后的基本原理.如果infinity对某种类型没有意义,那么不应该禁止它而不是要检查其有效性的标志吗?

Naw*_*waz 31

该函数对于 返回 的函数numeric_limits<T>::infinity()有意义.Tnumeric_limits<T>::has_infinitytrue

如果是T=int,它返回false.所以这种比较没有意义,因为numeric_limits<int>::infinity()没有返回任何有意义的值来进行比较.

  • 实际上,标准_requires_无意义的值为"0"或"false". (8认同)
  • 为什么我们甚至被允许进行没有意义的比较?如果有人尝试使用 `numeric_limits&lt;int&gt;::infinity()`,为什么不在编译时失败? (2认同)

Som*_*ude 6

如果您阅读此参考文献,您将看到一个表格,显示整数类型的无穷大为零.那是因为根据定义,C++中的整数类型不能是无限的.


Rob*_*obᵩ 5

相反,假设该标准确实保留了一些表示不稳定性的值,那就是numeric_limits<int>::infinity() > numeric_limits<int>::max()。这意味着将存在一些int大于的值max(),也就是说,的某些可表示值int大于int的最大可表示值。

显然,无论标准指定哪种方式,都违反了某些自然的理解。或者inifinity() <= max()存在x使得int(x) > max()。该标准必须选择要违反的自然规则。

我相信他们明智地选择了。

  • 还有第三种选择:要求实现拒绝使用“ numeric_limits &lt;int&gt; :: infinity()”的代码-可以通过一些元编程来实现。 (2认同)