2011-01-13 23 views
5

Básicamente quiero buscar el valor más pequeño (positivo) de un grupo de valores y necesito un valor predeterminado para compararlo con el primero. La suposición ingenua sería, ellos siempre comparan "menos que" (excepto NaN, pero no los consideremos) pero no estoy seguro.¿Cómo se comparan los valores arbitrarios de coma flotante con el infinito?

Estoy usando el tipo float y creo que se puede suponer con seguridad que mi hardware objetivo implementa un valor de infinito.

Aquí hay un código de ejemplo:

auto leastValue = std::numeric_limits<float>::infinity(); 
for (auto i = something.begin(), e = something.end(); i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+4

También podría simplemente usar el primer valor como su valor inicial. Lo más probable es que todavía funcione si lo pones en infinito; Solo señalo que en realidad * no necesita * usar un valor inicial especial. –

+0

Al sacar 'i' del ciclo y agregar un cheque adicional para una colección vacía, pude. Pero ¿no sería eso la pregunta inútil? ;) – kiw

+0

Usa 'std :: min_element' y deja que se preocupe por cosas como esa? –

Respuesta

8

para IEEE 754 flotadores, excepto NaN y el infinito, todo es menos que infinito. Lo más probable es que los tenga en su plataforma. Si eres paranoico, verifica con numeric_limits<float>::is_iec559. Si su plataforma no es conforme, use numeric_limits<float>::max(); si su secuencia no es vacía, no le dará un resultado incorrecto.

2

que apoyan comentario Michael Madsen: No es necesario un valor infinito para esta prueba,

tienda el primer valor de su grupo en una variable y luego comenzar su prueba con el segundo valor más del montón. (e incluso le ahorrará una prueba: P)

0

Creo que esto depende del comportamiento que espera si la secuencia está vacía. Si quiere infinito, su implementación está bien, de lo contrario debería usar el primer valor.

auto i = something.begin(); 
auto e = semething.end(); 
if (i == e) 
    throw std::exception("empty sequence"); 

auto leastValue = (*i)->GetValue(); 

for (++i; i != e; ++i) 
{ 
    auto value = (*i)->GetValue(); 
    if (value < leastValue) 
    { 
    leastValue = value; 
    } 
} 
+0

Infinity es, de hecho, la respuesta correcta si la secuencia está vacía. También puede ser la respuesta correcta si la secuencia no está vacía, porque no todos los elementos dan un valor (que no estaba en mi código de ejemplo). – kiw

Cuestiones relacionadas