Вы можете использовать std::numeric_limits
which is defined in, <limits>
чтобы найти минимальное или максимальное значение типов (если для типа существует специализация). Вы также можете использовать его для получения бесконечности (и поставить -
перед отрицательной бесконечностью).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Как отмечено в комментариях, min()
возвращает минимально возможное положительное значение. Другими словами, положительное значение, наиболее близкое к 0, которое может быть представлено. Наименьшее возможное значение - это отрицательное значение максимально возможного значения.
Конечно, std::max_element
существуют функции и min_element (определенные в <algorithm>
), которые могут быть лучшим выбором для поиска наибольшего или наименьшего значения в массиве.
numeric_limits<T>::lowest()
, который возвращает наименьшее (отрицательное) значение, возможное для типа, чтобы решить эту проблему.std::numeric_limits<float>::min()
никак не дает наименьшее положительное значение , которое может быть представлено; он дает наименьшее нормальное число с плавающей запятой одинарной точности. Между нулем и этим числом также есть субнормальные числа. В частности,std::numeric_limits<float>::min()
дает,1.17549e-38
но наименьшее представимое субнормальное число с плавающей запятой равноnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Вы можете использовать
-FLT_MAX
(или-DBL_MAX
) для максимального отрицательного числа иFLT_MAX
(илиDBL_MAX
) для положительного. Это дает вам диапазон возможных значений с плавающей запятой (или двойным).Вероятно, вы не хотите использовать
FLT_MIN
; оно соответствует наименьшему положительному числу, которое может быть представлено с помощью числа с плавающей запятой, а не самому отрицательному значению, которое может быть представлено с помощью числа с плавающей запятой.FLT_MIN
иFLT_MAX
соответствуютstd::numeric_limits<float>::min()
иstd::numeric_limits<float>::max()
.источник
FLT_MIN
] соответствует наименьшему положительному числу, которое может быть представлено с помощью числа с плавающей запятой» - Это неверно . Это наименьшее нормальное число. Есть еще и субнормальные числа.FLT_TRUE_MIN
наименьшее возможное число с плавающей запятой, что соответствуетstd::numeric_limits<float>::denorm_min()
Нет реальной необходимости инициализировать наименьшее / наибольшее возможное, чтобы найти наименьшее / наибольшее в массиве:
Или, если вы делаете это более одного раза:
Недостаток предоставления образца кода - я вижу, что другие уже предлагали ту же идею.
Обратите внимание, что хотя в стандарте есть min_element и max_element, их использование потребует двойного сканирования данных, что может быть проблемой, если массив вообще большой. Последние стандарты решили эту проблему, добавив a
std::minmax_element
, который делает то же самое, что иfind_extrema
выше (находит как минимальные, так и максимальные элементы в коллекции за один проход).Изменить: Решение проблемы поиска наименьшего ненулевого значения в массиве беззнаковых: обратите внимание, что беззнаковые значения «оборачиваются», когда достигают крайних значений. Чтобы найти наименьшее ненулевое значение, мы можем вычесть из каждого по единице для сравнения. Любые нулевые значения будут "переходить" в максимально возможное значение для типа, но связь между другими значениями будет сохранена. После того, как мы закончили, мы, очевидно, добавляем единицу к найденному значению.
Обратите внимание, что здесь по-прежнему используется первый элемент в качестве начального значения, но нам по-прежнему не нужен какой-либо код «особого случая» - так как он будет завершен до максимально возможного значения, любое ненулевое значение будет сравниваться как меньшее. Результатом будет наименьшее ненулевое значение или 0, если и только если вектор не содержал ненулевых значений.
источник
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Чтобы вручную найти минимум массива, вам не нужно знать минимальное значение float:
И аналогичный код для максимального значения.
источник
Могу я предложить вам инициализировать переменные «max и min пока» не до бесконечности, а до первого числа в массиве?
источник