Puede usar lo std::numeric_limits
que está definido en <limits>
para encontrar el valor mínimo o máximo de tipos (siempre que exista una especialización para el tipo). También puede usarlo para recuperar el infinito (y poner un -
delante para el infinito negativo).
#include <limits>
//...
std::numeric_limits<float>::max();
std::numeric_limits<float>::min();
std::numeric_limits<float>::infinity();
Como se señaló en los comentarios, min()
devuelve el valor positivo más bajo posible. En otras palabras, el valor positivo más cercano a 0 que se puede representar. El valor más bajo posible es el negativo del valor máximo posible.
Por supuesto, std::max_element
existen las funciones y min_element (definidas en <algorithm>
) que pueden ser una mejor opción para encontrar el valor más grande o más pequeño en una matriz.
numeric_limits<T>::lowest()
, que devuelve el valor más bajo (negativo) posible para que el tipo resuelva este problema.std::numeric_limits<float>::min()
no no dar el valor positivo más pequeño que puede ser representado; da el número de coma flotante de precisión simple normal más pequeño . También hay números subnormales entre cero y este número. En particular,std::numeric_limits<float>::min()
da1.17549e-38
pero el flotador subnormal representable más pequeño esnextafterf(0.0f, 1.0f) == 1.4013e-45f
.Puede usar
-FLT_MAX
(o-DBL_MAX
) para el número negativo de magnitud máxima yFLT_MAX
(oDBL_MAX
) para positivo. Esto le da el rango de posibles valores flotantes (o dobles).Probablemente no quieras usar
FLT_MIN
; corresponde al número positivo de menor magnitud que se puede representar con un flotante, no al valor más negativo representable con un flotante.FLT_MIN
yFLT_MAX
corresponden astd::numeric_limits<float>::min()
ystd::numeric_limits<float>::max()
.fuente
FLT_MIN
] corresponde al número positivo de menor magnitud que se puede representar con un flotante" - Esto no es cierto . Es el número normal más pequeño . También hay números subnormales.FLT_TRUE_MIN
el flotador más pequeño posible, que corresponde astd::numeric_limits<float>::denorm_min()
No hay una necesidad real de inicializar al menor / mayor posible para encontrar el menor / mayor en la matriz:
O, si lo está haciendo más de una vez:
La desventaja de proporcionar un código de muestra: veo que otros ya han sugerido la misma idea.
Tenga en cuenta que si bien el estándar tiene un elemento_mínimo y un elemento_máximo, usarlos requeriría escanear los datos dos veces, lo que podría ser un problema si la matriz es grande. Los estándares recientes han abordado esto agregando a
std::minmax_element
, que hace lo mismo que elfind_extrema
anterior (encuentre los elementos mínimo y máximo en una colección en una sola pasada).Editar: Abordar el problema de encontrar el valor más pequeño distinto de cero en una matriz de unsigned: observe que los valores sin signo se "envuelven" cuando llegan a un extremo. Para encontrar el valor más pequeño distinto de cero, podemos restar uno de cada uno para la comparación. Cualquier valor cero "se ajustará" al valor más grande posible para el tipo, pero se mantendrá la relación entre otros valores. Una vez que terminamos, obviamente agregamos uno al valor que encontramos.
Tenga en cuenta que esto todavía usa el primer elemento para el valor inicial, pero aún no necesitamos ningún código de "caso especial", ya que se ajustará al valor más grande posible, cualquier valor distinto de cero se comparará como más pequeño. El resultado será el valor más pequeño distinto de cero, o 0 si y solo si el vector no contiene valores distintos de cero.
fuente
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 el mínimo de una matriz, no necesita saber el valor mínimo de float:
Y código similar para el valor máximo.
fuente
¿Puedo sugerirle que inicialice sus variables de "máximo y mínimo hasta ahora" no al infinito, sino al primer número de la matriz?
fuente