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_MAX
DBL_MAX
사용하고 싶지 않을 것입니다 FLT_MIN
. 이것은 float로 나타낼 수있는 가장 작은 양의 값이 아니라 float로 나타낼 수있는 가장 작은 양수에 해당합니다.
FLT_MIN
및 FLT_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];
}
}
그리고 최대 값에 대한 유사한 코드.
답변
“지금까지 최대 및 최소”변수를 무한대가 아닌 배열의 첫 번째 숫자로 초기화하는 것이 좋습니다.