Подтвердить что ты не робот

Почему numeric_limits:: min возвращает отрицательное значение для int, но положительные значения для float/double?

Почему выполняет numeric_limits:: min возвращает отрицательное значение для int, но положительные значения, например. float и double?

#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

Из cppreference:

Возвращает минимальное конечное значение, представляемое числовым типом T.

Для типов с плавающей точкой с денормализацией min возвращает минимум положительное нормализованное значение. Обратите внимание, что это поведение может быть неожиданным, особенно по сравнению с поведением мин для интегральных типов. к найдите значение, которое не имеет значений меньше, чем значение, используйте numeric_limits::lowest.

min имеет смысл только для ограниченных типов и для неограниченных неподписанных типов, то есть типов, которые представляют собой бесконечный набор отрицательных значений не имеет значимого минимума.

4b9b3361

Ответ 1

По определению для плавающих типов min возвращает наименьшее положительное значение, которое тип может кодировать, а не самый низкий.

Если вы хотите наименьшее значение, используйте numeric_limits::lowest вместо этого.

Документация: http://en.cppreference.com/w/cpp/types/numeric_limits/min

Что касается почему, то я могу только предположить, что стандартному комитету необходимо было представить все формы экстремальных значений для всех разных типов. В случае интегральных типов существует только два типа экстремума: максимальное положительное и максимальное отрицание. Для поплавков есть другое: наименьшее возможное.

Если вы думаете, что семантика немного запутана, я согласен. Семантика связанного #define в стандарте C путается во многом таким же образом.

Ответ 2

Это печально, но за похожими именами совершенно другой смысл. Он был перенесен с C, где DBL_MIN и INT_MIN имеют ту же самую "проблему".

Как мало что можно сделать, просто помните, что означает что.