float를 최대 / 최소 값으로 어떻게 초기화합니까? float 또는 double의 절대 최대 값

float 또는 double의 절대 최대 값 또는 최소값을 어떻게 하드 코딩합니까? 단순히 반복하고 가장 큰 것을 잡아서 배열의 최대 / 최소를 검색하고 싶습니다.

float에 대한 양수 및 음수 무한대도 있습니다. 대신 사용해야합니까? 그렇다면 코드에서 어떻게 표시합니까?



답변

std::numeric_limits정의 된 <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>)가 있습니다.


답변

최대 크기 음수에는 (또는 )을 사용하고 양수 에는 -FLT_MAX(또는 -DBL_MAX)을 사용할 수 있습니다 . 이것은 가능한 float (또는 double) 값의 범위를 제공합니다.FLT_MAXDBL_MAX

사용하고 싶지 않을 것입니다 FLT_MIN. 이것은 float로 나타낼 수있는 가장 작은 양의 값이 아니라 float로 나타낼 수있는 가장 작은 양수에 해당합니다.

FLT_MINFLT_MAX대응 std::numeric_limits<float>::min()std::numeric_limits<float>::max().


답변

배열에서 가장 작은 / 가장 큰 것을 찾기 위해 가능한 가장 작은 / 최대로 초기화 할 필요가 없습니다.

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위와 동일한 역할 을하는를 추가하여이 문제를 해결했습니다 (단일 패스에서 컬렉션의 최소 및 최대 요소 모두 찾기).

편집 : 부호없는 배열에서 가장 작은 0이 아닌 값을 찾는 문제 해결 : 부호없는 값이 극단에 도달하면 “포장”되는 것을 관찰하십시오. 0이 아닌 가장 작은 값을 찾기 위해 비교를 위해 각각에서 하나를 뺄 수 있습니다. 0 값은 유형에 대해 가능한 가장 큰 값으로 “순환”되지만 다른 값 간의 관계 는 유지됩니다. 작업을 마치면 찾은 값에 다시 하나를 추가합니다.

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이 아닌 값은 더 작은 것으로 비교됩니다. 결과는 가장 작은 0이 아닌 값이거나 벡터에 0이 아닌 값이없는 경우에만 0이됩니다.


답변

배열의 최소값을 수동으로 찾으려면 float의 최소값을 알 필요가 없습니다.

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

그리고 최대 값에 대한 유사한 코드.


답변

“지금까지 최대 및 최소”변수를 무한대가 아닌 배열의 첫 번째 숫자로 초기화하는 것이 좋습니다.


답변