Я не уверен в обосновании, но это ожидаемое поведение. Ну, в том смысле, как это описывает Йосуттис (и, по-видимому, стандарт)!
min (): «Минимальное конечное значение (минимум
нормализованное значение для плавающей запятой
типы с денормализацией). "
Насколько я могу судить, если тип не целое число (numeric_limits<>::is_integer
) и имеет денормализацию (numeric_limits<>::has_denorm
) min()
вернет наименьшее представимое значение этот тип. В противном случае он вернет наименьшее значение , которое может быть отрицательным.
Для более согласованного интерфейса проверьте библиотеку Boost numeric / translation . В частности, класс черт bounds
. Вот фрагмент кода:
cout << "lowest float:" << boost::numeric::bounds<float>::lowest();
cout << "lowest int: " << boost::numeric::bounds<int>::lowest();
Вы также можете найти полезной библиотеку boost :: integer . Он приносит некоторую целочисленную поддержку C99 (например, int_least16_t
) в C ++ и может помочь выбрать тип с наилучшим размером для вашей конкретной потребности. Пример:
boost::uint_t<20>::fast fastest20bits; // fastest unsigned integer that
// can hold at least 20 bits.
boost::int_max_value_t<100000>::least // smallest integer that can store
// the value 100000.
Я часто нахожу, что когда мне нужно одно из boost :: numeric / translation или boost :: integer, мне нужны оба.