Você pode usar o std::numeric_limits
que está definido em <limits>
para encontrar o valor mínimo ou máximo dos tipos (desde que exista uma especialização para o tipo). Você também pode usá-lo para recuperar o infinito (e colocar um -
na frente para o infinito negativo).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Conforme observado nos comentários, min()
retorna o menor valor positivo possível. Em outras palavras, o valor positivo mais próximo de 0 que pode ser representado. O menor valor possível é o negativo do valor máximo possível.
Existem, é claro, as std::max_element
funções e min_element (definidas em <algorithm>
), que podem ser uma escolha melhor para encontrar o maior ou o menor valor em um array.
numeric_limits<T>::lowest()
, que retorna o menor valor (negativo) possível para o tipo para resolver este problema.std::numeric_limits<float>::min()
que não dão o valor positivo menor que pode ser representado; ele fornece o menor número normal de ponto flutuante de precisão única. Também existem números subnormais entre zero e este número. Em particular,std::numeric_limits<float>::min()
dá ,1.17549e-38
mas o menor flutuante subnormal representável énextafterf(0.0f, 1.0f) == 1.4013e-45f
.Você pode usar
-FLT_MAX
(ou-DBL_MAX
) para o número negativo de magnitude máxima eFLT_MAX
(ouDBL_MAX
) para positivo. Isso fornece a faixa de valores flutuantes (ou duplos) possíveis.Você provavelmente não deseja usar
FLT_MIN
; ele corresponde ao menor número positivo de magnitude que pode ser representado com um float, não o valor mais negativo representável com um float.FLT_MIN
eFLT_MAX
correspondem astd::numeric_limits<float>::min()
estd::numeric_limits<float>::max()
.fonte
FLT_MIN
] corresponde ao menor número positivo de magnitude que pode ser representado com um flutuador" - Isso não é verdade . É o menor número normal . Também existem números subnormais.FLT_TRUE_MIN
a menor flutuação real possível, que corresponde astd::numeric_limits<float>::denorm_min()
Não há necessidade real de inicializar para o menor / maior possível para encontrar o menor / maior na matriz:
Ou, se você estiver fazendo isso mais de uma vez:
A desvantagem de fornecer um código de amostra - vejo que outros já sugeriram a mesma ideia.
Observe que, embora o padrão tenha um min_element e max_element, usá-los exigiria a varredura dos dados duas vezes, o que poderia ser um problema se o array fosse grande. Padrões recentes trataram disso adicionando um
std::minmax_element
, que faz o mesmo que ofind_extrema
anterior (encontre os elementos mínimo e máximo em uma coleção em uma única passagem).Edit: Resolvendo o problema de encontrar o menor valor diferente de zero em uma matriz de não assinados: observe que os valores não assinados "envolvem" quando atingem um extremo. Para encontrar o menor valor diferente de zero, podemos subtrair um de cada para a comparação. Quaisquer valores zero serão "agrupados" no maior valor possível para o tipo, mas a relação entre os outros valores será mantida. Depois de terminarmos, obviamente adicionamos um de volta ao valor que encontramos.
Observe que isso ainda usa o primeiro elemento para o valor inicial, mas ainda não precisamos de nenhum código de "caso especial" - uma vez que isso envolverá o maior valor possível, qualquer valor diferente de zero será comparado como sendo menor. O resultado será o menor valor diferente de zero, ou 0 se e somente se o vetor não contiver valores diferentes de zero.
fonte
std::min_element
:bool less_ignoring_zero(unsigned a, unsigned b) { if (a == 0) return false; if (b == 0) return true; return a < b; }
Para encontrar manualmente o mínimo de uma matriz, você não precisa saber o valor mínimo de float:
E um código semelhante para o valor máximo.
fonte
Posso sugerir que você inicialize suas variáveis "máx. E mín. Até agora" não para o infinito, mas para o primeiro número na matriz?
fonte