94 votes

Comment initialiser un float à sa valeur max/min?

Comment puis-je coder en dur une valeur maximale ou minimale absolue pour un flottant ou un double ? Je veux rechercher le max/min d'un tableau en itérant simplement à travers et en capturant le plus grand.

Il y a aussi l'infini positif et négatif pour les flottants, devrais-je les utiliser à la place ? Si oui, comment le signifier dans mon code ?

145voto

Yacoby Points 29771

Vous pouvez utiliser std::numeric_limits qui est défini dans pour trouver la valeur minimale ou maximale des types (tant qu'une spécialisation existe pour le type). Vous pouvez également l'utiliser pour récupérer l'infini (et mettre un - devant pour l'infini négatif).

#include 

//...

std::numeric_limits::max();
std::numeric_limits::min();
std::numeric_limits::infinity();

Comme indiqué dans les commentaires, min() renvoie la plus petite valeur positive possible. En d'autres termes, la valeur positive la plus proche de 0 qui peut être représentée. La valeur la plus petite possible est le négatif de la valeur maximale possible.

Il y a bien sûr les fonctions std::max_element et min_element (définies dans ) qui peuvent être un meilleur choix pour trouver la plus grande ou la plus petite valeur dans un tableau.

40voto

MSN Points 30386

Vous pouvez utiliser soit -FLT_MAX (ou -DBL_MAX) pour le nombre négatif de la magnitude maximale et FLT_MAX (ou DBL_MAX) pour le positif. Cela vous donne la gamme des valeurs possibles pour un float (ou double).

Vous ne voulez probablement pas utiliser FLT_MIN; il correspond au nombre positif de la magnitude minimale pouvant être représenté avec un float, et non la valeur négative la plus représentable avec un float.

FLT_MIN et FLT_MAX correspondent à std::numeric_limits::min() et std::numeric_limits::max().

17voto

Jerry Coffin Points 237758

Il n'est pas nécessaire d'initialiser au plus petit/plus grand possible pour trouver le plus petit/plus grand dans le tableau :

double largest = smallest = array[0];
for (int i=1; i largest0
        largest= array[i];
}

Ou, si vous le faites plus d'une fois :

#include 

template 
std::pair find_extrema(iter begin, iter end) {
    std::pair 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;
}

L'inconvénient de fournir du code exemple - je vois que d'autres ont déjà suggéré la même idée.

Notez que bien que la norme dispose d'un min_element et d'un max_element, les utiliser nécessiterait de parcourir les données deux fois, ce qui pourrait poser problème si le tableau est assez grand. Les normes récentes ont abordé ce problème en ajoutant un std::minmax_element, qui fait la même chose que le find_extrema ci-dessus (trouver à la fois les éléments minimum et maximum dans une collection en un seul passage).

Édition : En abordant le problème de trouver la plus petite valeur non nulle dans un tableau d'entiers non signés : observez que les valeurs non signées "bouclent" quand elles atteignent un extrême. Pour trouver la plus petite valeur non nulle, nous pouvons soustraire un de chaque pour la comparaison. Toutes les valeurs zéro "boucleront" à la plus grande valeur possible pour le type, mais la relation entre les autres valeurs sera conservée. Après avoir terminé, ajoutons évidemment un à la valeur trouvée.

unsigned int min_nonzero(std::vector const &values) { 
    if (vector.size() == 0)
        return 0;
    unsigned int temp = values[0]-1;
    for (int i=1; i

`

Remarquez que cela utilise toujours le premier élément pour la valeur initiale, mais nous n'avons toujours pas besoin de code "cas spécial" - cela va boucler jusqu'à la plus grande valeur possible, toute valeur non nulle se comparera comme étant plus petite. Le résultat sera la plus petite valeur non nulle, ou 0 si et seulement si le vecteur ne contient aucune valeur non nulle.

`

5voto

Bill Points 7824

Pour trouver manuellement le minimum d'un tableau, vous n'avez pas besoin de connaître la valeur minimale du flottant :

float myFloats[];
...
float minimum = myFloats[0];
for (int i = 0; i < myFloatsSize; ++i)
{
  if (myFloats[i] < minimum)
  {
    minimum = myFloats[i];
  }
}

Et un code similaire pour la valeur maximale.

4voto

Puis-je suggérer que vous initialisiez vos variables "max et min actuels" non pas à l'infini, mais au premier nombre du tableau ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X