float를 최대 / 최소 값으로 어떻게 초기화합니까?


100

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

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

답변:


151

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>)가 있습니다.


이것을 정확히 어떻게 사용합니까? 무엇을 포함해야합니까? 나는 전에 이런 것을 사용한 적이 없다고 생각합니다.
Faken 2010-04-21

흠 ... 그 최대 요소 함수는 매우 유용했을 것입니다 ... 이것은 공식적으로가 아닌 혼자서 코딩을 배울 때 발생합니다. 당신은 바퀴를 50 번 이상 재발 명하게됩니다. 이것은 내가 ceil ()에 대해 마지막으로 배운 것과 같습니다. 감사합니다.
Faken 2010-04-21

18
@Yacoby, numeric_limits <float> :: min ()이 대부분의 음수 값을 의미하는 것이 아니라 가장 작은 양수를 의미한다는 것을 명확히하고 싶을 수 있습니다.
MSN

13
@killogre : C ++ 11 added numeric_limits<T>::lowest(), 유형이이 문제를 해결하기 위해 가능한 가장 낮은 (음수) 값을 반환합니다.
Cornstalks

3
std::numeric_limits<float>::min()표현할 수있는 가장 작은 양의 값을 제공 하지 않습니다 . 가장 작은 일반 단 정밀도 부동 소수점 수를 제공합니다. 0과이 숫자 사이 에는 비정규 숫자 도 있습니다 . 특히, std::numeric_limits<float>::min()제공 1.17549e-38하지만 표현 가능한 가장 작은 비정규 부동 소수점은 nextafterf(0.0f, 1.0f) == 1.4013e-45f.
nibot

45

최대 크기 음수에는 (또는 )을 사용하고 양수 에는 -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().


저는이 버전을 실제로 사용할 것이라고 생각합니다. 기억하기 더 간단하고 저에게 더 많은 장면을 만듭니다. 정수는 16 진수를 사용하여 초기화 할 수 있습니다. 그러나 그 대답은 새로운 매우 유용한 기능을 소개했기 때문에 여전히 베스트 답변이 남아 있습니다.
Faken 2010-04-21

2
"[ FLT_MIN]는 부동 소수점으로 표현할 수있는 가장 작은 양의 양수에 해당 합니다 . "- 이것은 사실이 아닙니다 . 가장 작은 정상 수입니다. 비정규 숫자도 있습니다.
nibot

당신 FLT_TRUE_MIN은 실제 가능한 가장 작은 float를 원합니다.std::numeric_limits<float>::denorm_min()
Chris Dodd

17

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

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이됩니다.


하지만 당신은 나로부터 +1을받습니다!
Dan Diplo

1
때로는 가장 작은 0이 아닌 값을 원하기 때문에 최대 최소값으로 초기화합니다 (예를 들어 부호없는 정수의 경우 내 데이터에 관심없는 0이 많은 경향이 있음). 첫 번째 요소가 0이 아닌지 확인하기 위해 추가 검사를 수행하는 것보다 초기화하는 것이 합리적입니다.
Faken 2010-04-21

@Faken : 그래도 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; }
UncleBens 2010

2
@Jerry : C ++ 0x는 언급 한 문제를 해결하기 위해 minmax_element를 추가합니다. (하지만 0을 무시하는 것은 불가능합니다 ...)
UncleBens 2010

1
초기화시 첫 번째 요소를 사용할 수 없으면 어떻게합니까? 이것은 온라인 처리에서 많이 발생합니다 (boost :: accumulators에서와 같이)
killogre

5

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

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.