답변:
에 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>
)가 있습니다.
numeric_limits<T>::lowest()
, 유형이이 문제를 해결하기 위해 가능한 가장 낮은 (음수) 값을 반환합니다.
std::numeric_limits<float>::min()
표현할 수있는 가장 작은 양의 값을 제공 하지 않습니다 . 가장 작은 일반 단 정밀도 부동 소수점 수를 제공합니다. 0과이 숫자 사이 에는 비정규 숫자 도 있습니다 . 특히, std::numeric_limits<float>::min()
제공 1.17549e-38
하지만 표현 가능한 가장 작은 비정규 부동 소수점은 nextafterf(0.0f, 1.0f) == 1.4013e-45f
.
최대 크기 음수에는 (또는 )을 사용하고 양수 에는 -FLT_MAX
(또는 -DBL_MAX
)을 사용할 수 있습니다 . 이것은 가능한 float (또는 double) 값의 범위를 제공합니다.FLT_MAX
DBL_MAX
사용하고 싶지 않을 것입니다 FLT_MIN
. 이것은 float로 나타낼 수있는 가장 작은 양의 값이 아니라 float로 나타낼 수있는 가장 작은 양수에 해당합니다.
FLT_MIN
및 FLT_MAX
대응 std::numeric_limits<float>::min()
과 std::numeric_limits<float>::max()
.
FLT_MIN
]는 부동 소수점으로 표현할 수있는 가장 작은 양의 양수에 해당 합니다 . "- 이것은 사실이 아닙니다 . 가장 작은 정상 수입니다. 비정규 숫자도 있습니다.
FLT_TRUE_MIN
은 실제 가능한 가장 작은 float를 원합니다.std::numeric_limits<float>::denorm_min()
배열에서 가장 작은 / 가장 큰 것을 찾기 위해 가능한 가장 작은 / 최대로 초기화 할 필요가 없습니다.
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이됩니다.
std::min_element
.bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
"지금까지 최대 및 최소"변수를 무한대가 아닌 배열의 첫 번째 숫자로 초기화하는 것이 좋습니다.