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