当前位置: 首页 > 知识库问答 >
问题:

为什么numeric_limits::min为int返回负值,为float/double返回正值?

孙斌
2023-03-14

为什么numeric_limits::min返回一个负值为int,但正值为例如浮动和双?

#include<iostream>
#include<limits>

using namespace std;

int main() {
  cout << "int: " << numeric_limits<int>::min() << " "
       << "float: " << numeric_limits<float>::min() << " "
       << "double: " << numeric_limits<double>::min() << "\n";
  return 0;
}

输出:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308

参考文献:

返回可由数字类型T表示的最小有限值。

对于具有反规范化的浮点类型,min返回最小的正规范化值。请注意,这种行为可能是意外的,特别是与整型类型的min行为相比。要查找没有值小于它的值,请使用numeric_limits::最低

min仅对有界类型和无界无符号类型有意义,也就是说,表示无穷多个负值的类型没有意义的最小值。

共有2个答案

仲孙文乐
2023-03-14

这很不幸,但在相似的名字背后,却隐藏着完全不同的含义。它有点像是从C语言中继承过来的,在C语言中,DBL_MIN和INT_MIN有着完全相同的“问题”。

因为能做的不多,只要记住什么意味着什么。

颛孙飞鸾
2023-03-14

根据定义,对于浮点类型,min返回类型可以编码的最小正值,而不是最低正值。

如果想要最小值,请使用数值限制::lowest

文档:http://en.cppreference.com/w/cpp/types/numeric_limits/min

至于为什么会这样,我只能推测标准委员会需要一种方法来代表所有不同原生类型的所有形式的极值。对于积分类型,只有两种类型的极值:最大正极值和最大负极值。对于浮动,还有另一个问题:尽可能小的浮动。

如果你觉得语义有点混乱,我同意。C标准中相关的#defines的语义也以大致相同的方式混乱。

 类似资料:
  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 查看javadoc,我看到ArrayList有一个重载的add方法: public boolean add(E e) 将指定的元素追加到此列表的末尾。 和 public void add(int index,E元素) 将指定的元素插入此列表中的指定位置。将当前在该位置的元素(如果有)和任何后续元素右移(将其索引添加一个)。 我注意到第一个返回了一个,而第二个返回了一个。事实证明,第一个

  • 我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序) 在客户端我用vue cookie设置cookie 在服务器端,我使用CookieParser 所以,在应用程序。我有这样的代码 并且,在文件中,我有这样一个GET请求的代码 问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie 添加

  • 问题内容: 我是一名编程初学者,对函数的返回值有疑问。 我正在学习Java。 我已经附上了我的书中具有经典选择排序功能的代码。 现在显然来自本书的代码可以正常工作。但是,主要功能中的以下三行是我的问题的基础: int [] a = new int [] {1,9,2,8,3,7,4,6​​,5}; 排序(a); if(ascending(a))System.out.println(“ Works”

  • 查看javadoc,我看到ArrayList有一个重载的add方法: 公共布尔加法(E E) 将指定的元素追加到此列表的末尾。 所以我去了收藏。添加(E): 布尔加法 确保此集合包含指定的元素(可选操作)。如果此集合由于调用而更改,则返回true。(如果此集合不允许重复并且已包含指定的元素,则返回false。) 这样,如果在集合中,则不采取任何操作。为什么返回而不是方法更好呢?

  • 问题内容: 如果我有包含10个元素的列表: 为什么l [10]返回IndexError,而l [-1]返回0? 如果列表中没有以前的元素,我想做的就是抛出一个错误。 问题答案: 在Python中,负列表索引表示从列表右边开始计数的项(即的简写形式)。 如果发现需要负索引来指示错误,那么您可以简单地检查这种情况并亲自引发异常(或在那里进行处理):