Как я трудно кодирую абсолютный максимум или минимальное значение для плавания или дважды? Я хочу найти макс. / минута массива путем простой итерации через и ловли самого большого.
Существует также положительная и отрицательная бесконечность для плаваний, я должен использовать их вместо этого? Если так, как я обозначаю это в своем коде?
Вы можете использовать std :: numeric_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 (определенные в
), которые могут быть лучшим выбором для поиска наибольшего или наименьшего значения в массиве. .
Вы можете использовать -FLT_MAX
(или -DBL_MAX
) для максимального отрицательного числа и FLT_MAX
(или DBL_MAX
). для положительного. Это дает вам диапазон возможных значений с плавающей запятой (или двойным).
Вероятно, вы не захотите использовать FLT_MIN
; оно соответствует наименьшему положительному числу, которое может быть представлено с помощью числа с плавающей запятой, а не самому отрицательному значению, которое может быть представлено с помощью числа с плавающей запятой.
FLT_MIN
и FLT_MAX
соответствуют std :: numeric_limits
и std :: numeric_limits
.
Нет реальной необходимости инициализировать наименьшее / наибольшее возможное, чтобы найти наименьшее / наибольшее в массиве:
double largest = smallest = array[0];
for (int i=1; i<array_size; i++) {
if (array[i] < smallest)
smallest = array[i];
if (array[i] > largest0
largest= array[i];
}
Или, если вы делаете это более одного раза:
#include <utility>
template <class iter>
std::pair<typename iter::value_type, typename iter::value_type> find_extrema(iter begin, iter end) {
std::pair<typename iter::value_type, typename iter::value_type> ret;
ret.first = ret.second = *begin;
while (++begin != end) {
if (*begin < ret.first)
ret.first = *begin;
if (*begin > ret.second)
ret.second = *begin;
}
return ret;
}
Недостаток предоставления образца кода - Я вижу, что другие уже предлагали ту же идею.
Обратите внимание, что хотя в стандарте есть min_element и max_element, их использование потребует двойного сканирования данных, что может стать проблемой, если массив вообще большой. Последние стандарты решили эту проблему, добавив std :: minmax_element
, который делает то же самое, что и find_extrema
выше (находит минимальные и максимальные элементы в коллекции за один проход).
Редактировать: Решение проблемы поиска наименьшего ненулевого значения в массиве беззнаковых: обратите внимание, что беззнаковые значения «оборачиваются», когда достигают крайних значений. Чтобы найти наименьшее ненулевое значение, мы можем вычесть из каждого по единице для сравнения. Любые нулевые значения будут "переходить" к максимально возможному значению для типа, но связь между другими значениями будет сохранена. После того, как мы закончили, мы, очевидно, добавляем единицу к найденному значению.
unsigned int min_nonzero(std::vector<unsigned int> const &values) {
if (vector.size() == 0)
return 0;
unsigned int temp = values[0]-1;
for (int i=1; i<values.size(); i++)
if (values[i]-1 < temp)
temp = values[i]-1;
return temp+1;
}
Обратите внимание, что здесь по-прежнему используется первый элемент в качестве начального значения, но нам по-прежнему не нужен какой-либо код для «особого случая» - поскольку он переходит к максимально возможному значению, любое ненулевое значение будет сравниваться как меньше. Результатом будет наименьшее ненулевое значение или 0, если и только если вектор не содержал ненулевых значений.
Чтобы вручную найти минимум массива, вам не нужно знать минимальное значение float:
float myFloats[];
...
float minimum = myFloats[0];
for (int i = 0; i < myFloatsSize; ++i)
{
if (myFloats[i] < minimum)
{
minimum = myFloats[i];
}
}
И аналогичный код для максимального значения .
Могу я предложить вам инициализировать переменные "max и min пока" не до бесконечности, а до первого числа в массиве?
{ {1}}