Vous pouvez utiliser std::numeric_limits
ce qui est défini dans <limits>
pour trouver la valeur minimale ou maximale des types (tant qu'il existe une spécialisation pour le type). Vous pouvez également l'utiliser pour récupérer l'infini (et mettre un -
devant pour l'infini négatif).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Comme indiqué dans les commentaires, min()
renvoie la valeur positive la plus basse possible. En d'autres termes, la valeur positive la plus proche de 0 qui peut être représentée. La valeur la plus basse possible est la valeur négative de la valeur maximale possible.
Il y a bien sûr les std::max_element
fonctions et min_element (définies dans <algorithm>
) qui peuvent être un meilleur choix pour trouver la valeur la plus grande ou la plus petite d'un tableau.
numeric_limits<T>::lowest()
, qui renvoie la valeur la plus basse (négative) possible pour le type pour résoudre ce problème.std::numeric_limits<float>::min()
ne donne pas la plus petite valeur positive qui puisse être représentée; il donne le plus petit nombre normal à virgule flottante simple précision. Il existe également des nombres inférieurs à la normale entre zéro et ce nombre. En particulier,std::numeric_limits<float>::min()
donne1.17549e-38
mais le plus petit flotteur subnormal représentable estnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Vous pouvez utiliser
-FLT_MAX
(ou-DBL_MAX
) pour le nombre négatif de magnitude maximale etFLT_MAX
(ouDBL_MAX
) pour le positif. Cela vous donne la plage de valeurs flottantes (ou doubles) possibles.Vous ne voulez probablement pas utiliser
FLT_MIN
; il correspond au plus petit nombre positif de magnitude pouvant être représenté avec un flottant, et non à la valeur la plus négative représentable avec un flottant.FLT_MIN
etFLT_MAX
correspondent àstd::numeric_limits<float>::min()
etstd::numeric_limits<float>::max()
.la source
FLT_MIN
] correspond au plus petit nombre positif de magnitude qui peut être représenté avec un flotteur" - Ce n'est pas vrai . C'est le plus petit nombre normal . Il existe également des nombres inférieurs à la normale.FLT_TRUE_MIN
le plus petit flotteur possible, ce qui correspond àstd::numeric_limits<float>::denorm_min()
Il n'y a pas vraiment besoin de s'initialiser au plus petit / plus grand possible pour trouver le plus petit / le plus grand du tableau:
Ou, si vous le faites plus d'une fois:
L'inconvénient de fournir un exemple de code - je vois que d'autres ont déjà suggéré la même idée.
Notez que bien que la norme ait un min_element et un max_element, leur utilisation nécessiterait de parcourir les données deux fois, ce qui pourrait poser un problème si le tableau est grand. Des normes récentes ont résolu ce problème en ajoutant un
std::minmax_element
, qui fait la même chose quefind_extrema
ci - dessus (trouvez à la fois les éléments minimum et maximum dans une collection en un seul passage).Edit: Résoudre le problème de la recherche de la plus petite valeur non nulle dans un tableau de unsigned: observez que les valeurs non signées «s'enroulent» lorsqu'elles atteignent un extrême. Pour trouver la plus petite valeur non nulle, nous pouvons soustraire une de chacune pour la comparaison. Toute valeur nulle sera "enveloppée" à la plus grande valeur possible pour le type, mais la relation entre les autres valeurs sera conservée. Une fois que nous avons terminé, nous en rajoutons évidemment un à la valeur que nous avons trouvée.
Notez que cela utilise toujours le premier élément pour la valeur initiale, mais nous n'avons toujours pas besoin de code de «cas spécial» - puisque cela se terminera par la plus grande valeur possible, toute valeur non nulle sera comparée comme étant plus petite. Le résultat sera la plus petite valeur différente de zéro, ou 0 si et seulement si le vecteur ne contient aucune valeur différente de zéro.
la source
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Pour trouver manuellement le minimum d'un tableau, vous n'avez pas besoin de connaître la valeur minimum de float:
Et un code similaire pour la valeur maximale.
la source
Puis-je vous suggérer d'initialiser vos variables "max et min jusqu'ici" non pas à l'infini, mais au premier nombre du tableau?
la source