Możesz użyć tego, std::numeric_limits
który jest zdefiniowany w, <limits>
aby znaleźć minimalną lub maksymalną wartość typów (o ile istnieje specjalizacja dla typu). Możesz także użyć go do odzyskania nieskończoności (i wstaw -
przed siebie ujemną nieskończoność).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Jak zauważono w komentarzach, min()
zwraca najniższą możliwą wartość dodatnią. Innymi słowy, wartość dodatnia najbliższa 0, którą można przedstawić. Najniższa możliwa wartość jest ujemną wartością maksymalnej możliwej wartości.
Istnieją oczywiście funkcje std::max_element
i min_element (zdefiniowane w <algorithm>
), które mogą być lepszym wyborem do znalezienia największej lub najmniejszej wartości w tablicy.
numeric_limits<T>::lowest()
, który zwraca najniższą (ujemną) wartość możliwą do rozwiązania tego problemu przez typ.std::numeric_limits<float>::min()
sposób nie da najmniejszą wartość dodatnią, który może być reprezentowany; daje najmniejszą normalną liczbę zmiennoprzecinkową o pojedynczej precyzji. Istnieją również liczby podnormalne od zera do tej liczby. W szczególnościstd::numeric_limits<float>::min()
daje,1.17549e-38
ale najmniejszą reprezentowalną wartością zmiennoprzecinkową jestnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Możesz użyć
-FLT_MAX
(lub-DBL_MAX
) dla maksymalnej liczby ujemnej wielkości iFLT_MAX
(lubDBL_MAX
) dla wartości dodatniej. Daje to zakres możliwych wartości zmiennoprzecinkowych (lub podwójnych).Prawdopodobnie nie chcesz używać
FLT_MIN
; odpowiada najmniejszej dodatniej liczbie wielkości, którą można przedstawić za pomocą liczby zmiennoprzecinkowej, a nie najbardziej ujemnej wartości reprezentowanej przez zmiennoprzecinkę.FLT_MIN
iFLT_MAX
odpowiadająstd::numeric_limits<float>::min()
istd::numeric_limits<float>::max()
.źródło
FLT_MIN
] odpowiada najmniejszej dodatniej liczbie wielkości, którą można przedstawić za pomocą liczby zmiennoprzecinkowej” - to nieprawda . To najmniejsza normalna liczba. Istnieją również liczby poniżej normy.FLT_TRUE_MIN
dla rzeczywistego najmniejszego możliwego pływaka, który odpowiadastd::numeric_limits<float>::denorm_min()
Nie ma rzeczywistej potrzeby inicjalizacji do najmniejszej / największej możliwej wartości, aby znaleźć najmniejszą / największą w tablicy:
Lub, jeśli robisz to więcej niż raz:
Wada podania przykładowego kodu - widzę, że inni już zasugerowali ten sam pomysł.
Zauważ, że chociaż standard ma elementy min_element i max_element, użycie ich wymagałoby dwukrotnego przeskanowania danych, co może być problemem, jeśli tablica jest w ogóle duża. Najnowsze standardy rozwiązały ten problem, dodając a
std::minmax_element
, co robi to samo, cofind_extrema
powyżej (znajduje zarówno minimum, jak i maksimum elementów w kolekcji w jednym przebiegu).Edycja: Rozwiązanie problemu znalezienia najmniejszej niezerowej wartości w tablicy bez znaku: zauważ, że wartości bez znaku „zawijają się”, gdy osiągają ekstremum. Aby znaleźć najmniejszą wartość różną od zera, możemy odjąć po jednym dla porównania. Wszelkie wartości zerowe zostaną „zawinięte” do największej możliwej wartości dla typu, ale relacje między innymi wartościami zostaną zachowane. Po zakończeniu oczywiście dodajemy jeden z powrotem do znalezionej wartości.
Zauważ, że nadal używa pierwszego elementu jako wartości początkowej, ale nadal nie potrzebujemy żadnego kodu „specjalnego przypadku” - ponieważ będzie on zawijany do największej możliwej wartości, każda wartość niezerowa zostanie porównana jako mniejsza. Wynikiem będzie najmniejsza wartość niezerowa lub 0 wtedy i tylko wtedy, gdy wektor nie zawiera wartości niezerowych.
źródło
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Aby ręcznie znaleźć minimum tablicy, nie musisz znać minimalnej wartości float:
I podobny kod dla maksymalnej wartości.
źródło
Czy mogę zasugerować, abyś zainicjował swoje zmienne „max i min do tej pory” nie do nieskończoności, ale do pierwszej liczby w tablicy?
źródło