Почему 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 имеет смысл только для ограниченных типов и для неограниченных неподписанных типов, то есть типов, которые представляют собой бесконечный набор отрицательных значений не имеет значимого минимума.
Ответы
Ответ 1
По определению для плавающих типов min
возвращает наименьшее положительное значение, которое тип может кодировать, а не самый низкий.
Если вы хотите наименьшее значение, используйте numeric_limits::lowest
вместо этого.
Документация: http://en.cppreference.com/w/cpp/types/numeric_limits/min
Что касается почему, то я могу только предположить, что стандартному комитету необходимо было представить все формы экстремальных значений для всех разных типов. В случае интегральных типов существует только два типа экстремума: максимальное положительное и максимальное отрицание. Для поплавков есть другое: наименьшее возможное.
Если вы думаете, что семантика немного запутана, я согласен. Семантика связанного #define
в стандарте C путается во многом таким же образом.
Ответ 2
Это печально, но за похожими именами совершенно другой смысл. Он был перенесен с C, где DBL_MIN и INT_MIN имеют ту же самую "проблему".
Как мало что можно сделать, просто помните, что означает что.