¿Por qué Splint (el verificador de código C) da un error al comparar un float con un int?

StackOverflow https://stackoverflow.com/questions/38027

  •  09-06-2019
  •  | 
  •  

Pregunta

Ambos son valores matemáticos, sin embargo el flotador sí tiene más precisión.¿Es esa la única razón del error: la diferencia de precisión?¿O existe otro problema potencial (y más grave)?

¿Fue útil?

Solución

Es porque el conjunto de valores enteros no es igual al conjunto de valores flotantes para los tipos 'int' y 'float'.Por ejemplo, el valor flotante 0,5 no tiene igual en el conjunto de números enteros y es posible que el valor entero 4519245367 no exista en el conjunto de valores que un flotante puede almacenar.Entonces, el verificador marca esto como un problema que debe verificar el programador.

Otros consejos

Porque probablemente no sea una muy buena idea.No todos los flotantes se pueden truncar a enteros;No todos los enteros se pueden convertir en flotantes.

Al realizar la comparación, el valor entero será "promovido" a un valor de punto flotante.En ese punto estás haciendo una comparación de igualdad exacta entre dos números de coma flotante, lo cual casi siempre es algo malo.

Por lo general, debería tener algún tipo de "bola épsilon", o rango de valores aceptables, y realizar la comparación si los dos valores están lo suficientemente cerca entre sí como para considerarse iguales.Necesitas una función más o menos como esta:

int double_equals(double a, double b, double epsilon)
{
   return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}

Si su aplicación no tiene una opción obvia de épsilon, utilice DBL_EPSILON.

Debido a que los flotantes no pueden almacenar un valor int exacto, si tiene dos variables, int i y float f, incluso si asigna "i = f;", la comparación "if (i == f)" probablemente no lo hará. devolver verdadero.

Suponiendo enteros con signo y formato de punto flotante IEEE, las magnitudes de los enteros que se pueden representar son:

short  -> 15 bits
float  -> 23 bits
long   -> 31 bits
double -> 52 bits

Por lo tanto un float puede representar cualquier short y un double puede representar cualquier long.

Si necesita solucionar esto (tiene una razón legítima y está contento de que ninguno de los problemas mencionados en las otras respuestas sea un problema para usted), simplemente transfiera de un tipo a otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top