как я инициализирую плавание к его макс. значению / минимальному значению?

Как я трудно кодирую абсолютный максимум или минимальное значение для плавания или дважды? Я хочу найти макс. / минута массива путем простой итерации через и ловли самого большого.

Существует также положительная и отрицательная бесконечность для плаваний, я должен использовать их вместо этого? Если так, как я обозначаю это в своем коде?

93
задан Carl Manaster 21 April 2010 в 16:19
поделиться

5 ответов

Вы можете использовать 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 (определенные в ), которые могут быть лучшим выбором для поиска наибольшего или наименьшего значения в массиве. .

144
ответ дан 24 November 2019 в 06:15
поделиться

Вы можете использовать -FLT_MAX (или -DBL_MAX ) для максимального отрицательного числа и FLT_MAX (или DBL_MAX ). для положительного. Это дает вам диапазон возможных значений с плавающей запятой (или двойным).

Вероятно, вы не захотите использовать FLT_MIN ; оно соответствует наименьшему положительному числу, которое может быть представлено с помощью числа с плавающей запятой, а не самому отрицательному значению, которое может быть представлено с помощью числа с плавающей запятой.

FLT_MIN и FLT_MAX соответствуют std :: numeric_limits :: min () и std :: numeric_limits :: max ( ) .

40
ответ дан 24 November 2019 в 06:15
поделиться

Нет реальной необходимости инициализировать наименьшее / наибольшее возможное, чтобы найти наименьшее / наибольшее в массиве:

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, если и только если вектор не содержал ненулевых значений.

17
ответ дан 24 November 2019 в 06:15
поделиться

Чтобы вручную найти минимум массива, вам не нужно знать минимальное значение float:

float myFloats[];
...
float minimum = myFloats[0];
for (int i = 0; i < myFloatsSize; ++i)
{
  if (myFloats[i] < minimum)
  {
    minimum = myFloats[i];
  }
}

И аналогичный код для максимального значения .

5
ответ дан 24 November 2019 в 06:15
поделиться

Могу я предложить вам инициализировать переменные "max и min пока" не до бесконечности, а до первого числа в массиве?

{ {1}}
4
ответ дан 24 November 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: