Riesgo de operaciones lógicas en las variables de coma flotante en c ++

Video: Convertir un número decimal a coma flotante de 32 bits

errores de redondeo en el cálculo de coma flotante pueden crear estragos en las operaciones lógicas en C ++, por lo que debe tener cuidado de realizar operaciones lógicas en las variables de punto flotante. Consideremos el siguiente ejemplo:

flotar f1 = 10.0-flotador f2 = f1 / 3-bool b1 = (f1 == (f2 * 3,0)) - // son estos dos iguales?

Aunque es obvio que f1 es igual a f2 Tiempos 3, el valor resultante de b1 no es necesariamente cierto. Una variable de punto flotante no puede contener un número ilimitado de cifras significativas. Así, f2 no es igual a la cantidad que llamaríamos “de tres y un tercio”, sino más bien a 3.3333 ..., deteniéndose después de algún número de cifras decimales.

UN flotador variable de apoya sobre 7 dígitos de precisión, mientras que una doble soporta una skosh más de 16 dígitos. Estos números son aproximados porque el equipo es probable que genere un número como 3.3333347 debido a los caprichos en cálculos de punto flotante.

Ahora, en matemática pura, el número de 3s después de la coma decimal es infinita, pero ninguna computadora construida puede manejar un número infinito de dígitos. Así, después de multiplicar por 3,3333 3, se obtiene 9,9999 en lugar de los 10 que obtendría si multiplicado “de tres y un tercio” - en efecto, una error de redondeo. Tales pequeñas diferencias pueden ser imperceptible para una persona, pero no a la computadora. La igualdad significa exactamente eso - exacto igualdad.

Los procesadores modernos son sofisticados en la realización de estos cálculos. El procesador puede, de hecho, acomodar el error de redondeo, pero desde el interior de C ++, no se puede predecir con exactitud lo que cualquier procesador dado va a hacer.

La comparación más seguro sigue:

flotar f1 = 10.0-flotador f2 = f1 / 3-flotador f3 = f2 * 3,0-flotador delta = f1 - f3-bool bEqual = -0,0001 lt; delta && delta lt; 0.0001-

Esta comparación es cierto Si f1 y f3 están dentro de algún pequeño delta entre sí, que todavía debe ser cierto incluso si usted toma algún pequeño error de redondeo en cuenta.

Video: LENGUAJE C CON XC8 - TEMA 3 - TIPO DE DATOS CON COMA FLOTANTE

La lógica AND && y lógica OR || operadores en C ++ realizan lo que se llama Evaluación de cortocircuito. Considera lo siguiente:

condición1 && condición2

Si condición1 no es cierto, el resultado global no es cierto, no importa lo que el valor de condición2. (Por ejemplo, condición2 podría ser cierto o falso . Sin cambiar el resultado) La misma situación se produce en los siguientes:

condición1 || condición2

Si condición1 es cierto, el resultado es cierto, no importa lo que el valor de condición2 es.

Para ahorrar tiempo, C ++ no evalúa condición2 si no es necesario. Por ejemplo, en la expresión condición1 && condición2, C ++ no evalúa condición2 Si condición1 es falso. Del mismo modo, en la expresión condición1 || condición2, C ++ no evalúa condición2 Si condición1 es cierto. Esto se conoce como la evaluación de cortocircuito.

Evaluación de cortocircuito puede significar que condición2 no se evalúa incluso si esa condición no tiene efectos secundarios. Considere el siguiente fragmento de código es cierto ideado:

int nArg1 = 1-int nArg2 = 2-int nArg3 = 3-bool b = (nArg1 gt; nArg2) && (NArg2 ++ gt; nArg3) -

La variable nArg2 Nunca se incrementa debido a la comparación nArg2 ++ gt; nArg3 no se realiza. No hay necesidad, porque nArg1 gt; nArg2 Ya devuelto un falso por lo que la expresión global debe ser falso.

Artículos Relacionados