Sie können std::numeric_limits
den in definierten <limits>
Wert verwenden, um den minimalen oder maximalen Wert von Typen zu ermitteln (sofern für den Typ eine Spezialisierung vorhanden ist). Sie können es auch verwenden, um die Unendlichkeit abzurufen (und ein -
Vorzeichen für die negative Unendlichkeit zu setzen).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Wie in den Kommentaren angegeben, wird min()
der niedrigstmögliche positive Wert zurückgegeben. Mit anderen Worten, der positive Wert, der 0 am nächsten kommt und dargestellt werden kann. Der niedrigstmögliche Wert ist das Negativ des maximal möglichen Werts.
Es gibt natürlich die std::max_element
Funktionen und min_element (definiert in <algorithm>
), die eine bessere Wahl sein können, um den größten oder kleinsten Wert in einem Array zu finden.
numeric_limits<T>::lowest()
, wodurch der niedrigste (negative) Wert zurückgegeben wird, der für den Typ zur Lösung dieses Problems möglich ist.std::numeric_limits<float>::min()
gibt nicht den kleinsten positiven Wert an, der dargestellt werden kann; Es gibt die kleinste normale Gleitkommazahl mit einfacher Genauigkeit. Es gibt auch subnormale Zahlen zwischen Null und dieser Zahl. Insbesonderestd::numeric_limits<float>::min()
gibt es1.17549e-38
aber den kleinsten darstellbaren subnormalen Floatnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Sie können entweder
-FLT_MAX
(oder-DBL_MAX
) für die negative Zahl mit maximaler Größe undFLT_MAX
(oderDBL_MAX
) für positiv verwenden. Dies gibt Ihnen den Bereich möglicher Float- (oder Double-) Werte.Sie möchten wahrscheinlich nicht verwenden
FLT_MIN
; Sie entspricht der kleinsten positiven Zahl, die mit einem Float dargestellt werden kann, nicht dem negativsten Wert, der mit einem Float dargestellt werden kann.FLT_MIN
undFLT_MAX
entsprechenstd::numeric_limits<float>::min()
undstd::numeric_limits<float>::max()
.quelle
FLT_MIN
] entspricht der kleinsten positiven Zahl, die mit einem Float dargestellt werden kann" - Dies ist nicht wahr . Es ist die kleinste normale Zahl. Es gibt auch subnormale Zahlen.FLT_TRUE_MIN
für den tatsächlich kleinstmöglichen Schwimmer, der entsprichtstd::numeric_limits<float>::denorm_min()
Es ist nicht wirklich erforderlich, auf möglichst klein / groß zu initialisieren, um das kleinste / größte im Array zu finden:
Oder wenn Sie es mehr als einmal tun:
Der Nachteil der Bereitstellung von Beispielcode - ich sehe, dass andere bereits die gleiche Idee vorgeschlagen haben.
Beachten Sie, dass der Standard zwar ein min_element und ein max_element enthält, für deren Verwendung jedoch ein zweimaliges Durchsuchen der Daten erforderlich ist. Dies kann ein Problem sein, wenn das Array überhaupt groß ist. Neuere Standards haben dies durch Hinzufügen eines a behoben
std::minmax_element
, das dasselbe wiefind_extrema
oben tut (finden Sie sowohl die minimalen als auch die maximalen Elemente in einer Sammlung in einem einzigen Durchgang).Bearbeiten: Behebung des Problems, den kleinsten Wert ungleich Null in einem Array von vorzeichenlosen Werten zu finden: Beachten Sie, dass vorzeichenlose Werte "umlaufen", wenn sie ein Extrem erreichen. Um den kleinsten Wert ungleich Null zu finden, können wir für den Vergleich jeweils einen subtrahieren. Alle Nullwerte werden auf den größtmöglichen Wert für den Typ "umgebrochen", aber die Beziehung zwischen anderen Werten bleibt erhalten. Nachdem wir fertig sind, fügen wir dem gefundenen Wert offensichtlich einen hinzu.
Beachten Sie, dass hierfür immer noch das erste Element für den Anfangswert verwendet wird, wir jedoch keinen "Sonderfall" -Code benötigen. Da dieser Wert auf den größtmöglichen Wert umgebrochen wird, wird jeder Wert ungleich Null als kleiner verglichen. Das Ergebnis ist der kleinste Wert ungleich Null oder genau dann 0, wenn der Vektor keine Werte ungleich Null enthält.
quelle
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Um das Minimum eines Arrays manuell zu ermitteln, müssen Sie den Mindestwert von float nicht kennen:
Und ähnlicher Code für den Maximalwert.
quelle
Darf ich vorschlagen, dass Sie Ihre Variablen "max und min bisher" nicht auf unendlich, sondern auf die erste Zahl im Array initialisieren?
quelle