es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué 0.2f + 0.3f == 0.5f?

Ya sé cómo se almacenan los números de punto flotante en la memoria y entiendo por qué la expresión 0.1 + 0.2 != 0.3 es verdadera.

Pero no entiendo por qué 0.2f + 0.3f == 0.5f es verdadera.
Aquí está mi código:

cout << setprecision(64)
<< “0.3 = ” << 0.3 << “\n”
<< “0.2 = ” << 0.2 << “\n”
<< “0.2 + 0.3 = ” << 0.2 + 0.3 << “\n”
<< “0.3f = ” << 0.3f << “\n”
<< “0.2f = ” << 0.2f << “\n”
<< “0.2f + 0.3f = ” << 0.2f + 0.3f << “\n”;

Obtengo la salida:

0.3 = 0.299999999999999988897769753748434595763683319091796875
0.2 = 0.200000000000000011102230246251565404236316680908203125
0.2 + 0.3 = 0.5
0.3f = 0.300000011920928955078125
0.2f = 0.20000000298023223876953125
0.2f + 0.3f = 0.5

Estoy de acuerdo en que si sumamos 0.3 + 0.2 con tipos de datos double, el resultado será 0.5, porque 0.299999999999999988897769753748434595763683319091796875 + 0.200000000000000011102230246251565404236316680908203125 = 0.5.

Pero todavía no entiendo por qué la suma de 0.2f + 0.3f también es 0.5. Esperaría que el resultado sea 0.50000001490116119384765625 (0.300000011920928955078125 + 0.20000000298023223876953125).
¿Podrías ayudarme a entender dónde me equivoco?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual 0.2f + 0.3f == 0.5f es verdadero se debe a que la aritmética de punto flotante funciona de manera diferente en valores de precisión simple y precisión doble. Los valores de precisión simple (float) tienen 32 bits para representar un número, mientras que los valores de precisión doble (double) tienen 64 bits. Cuando se opera un valor float con otro valor float, la aritmética se realiza utilizando aritmética de precisión simple. Esto significa que los operandos se redondean a 24 bits antes de la operación. Este redondeo puede causar errores de redondeo, pero en este caso, los errores introducidos por cada operando se cancelan entre sí, dando como resultado la respuesta correcta de 0.5f.

    En tu código, 0.2f y 0.3f son ambos valores float, y cuando se suman, la operación se realiza utilizando aritmética de punto flotante de precisión simple. El resultado de 0.2f + 0.3f es 0.5f porque los errores de redondeo introducidos por cada operando se cancelan entre sí.

    Sin embargo, cuando se suma 0.2 + 0.3 con tipos double, la aritmética se realiza utilizando aritmética de punto flotante de precisión doble, y el error de redondeo no se cancela, dando como resultado la respuesta incorrecta de 0.299999999999999988897769753748434595763683319091796875 + 0.200000000000000011102230246251565404236316680908203125 = 0.499999999999999988897769753748434595763683319091796875.

    Por lo tanto, es importante ser consciente de las limitaciones de la aritmética de punto flotante y utilizar tipos y técnicas apropiadas para minimizar los errores de redondeo.

Comments are closed.