definicion - que es float en programacion
Comprender la comparaciĆ³n de variables flotantes en if() (2)
0.1
literal es double
. Pierdes precisión aquí float f = 0.1;
Se podría decir que perdemos precisión durante la comparación otra vez, entonces ¿por qué no es f == 0.1
verdadero de todos modos? Porque el float
extiende al double
, no al revés. En C, el tipo más pequeño siempre se extiende al más grande.
Simplificado su ejemplo, podemos decir que double(float(1.0)) != 1.0
Soluciones posibles:
- Usa
double
lugar defloat
como un tipo def
. - usa cast como en tu segundo ejemplo
- use literales
float
- reemplace todos los0.1
con0.1f
Mejor solución
Las variables de coma flotante tienen muchos problemas con las comparaciones. Ellos, incluido este, pueden resolverse definiendo su propia función de comparación:
bool fp_equal(double a, double b, double eps = FLT_EPSILON) {
return fabs(a - b) < fabs(eps * a);
}
La segunda parte de la pregunta:
La razón por la cual la respuesta es falsa es porque la parte else
siempre corresponde al bloque if
más interno. Entonces se confundió al formatear, el código es equivalente a:
#include <stdio.h>
int main()
{
int n = 0, m = 0;
if (n > 0) {
if (m > 0) {
printf("True");
}
else {
printf("False");
}
}
}
Esta pregunta ya tiene una respuesta aquí:
No se puede encontrar la razón para el siguiente fragmento de código:
#include <stdio.h>
int main()
{
float f = 0.1;
if (f == 0.1)
printf("True");
else
printf("False");
return 0;
}
El resultado es falso.
#include <stdio.h>
int main()
{
float f = 0.1;
if (f == (float)0.1)
printf("True");
else
printf("False");
return 0;
}
Ahora muestra la salida correcta. ¿Cuál es la razón detrás de esto?
También cuál es la razón de este comportamiento.
#include <stdio.h>
main()
{
int n = 0, m = 0;
if (n > 0)
if (m > 0)
printf("True");
else
printf("False");
}
Responda a su segunda pregunta (tercer ejemplo):
De acuerdo con su criterio, el código no hace lo que usted espera:
#include <stdio.h>
main()
{
int n = 0, m = 0;
if (n > 0)
if (m > 0)
printf("True");
else
printf("False");
}
Aquí el else
pertenece al interior if
, por lo que es igual a
#include <stdio.h>
main()
{
int n = 0, m = 0;
if (n > 0) {
if (m > 0) {
printf("True");
} else {
printf("False");
}
}
}
pero creo que querías decir:
#include <stdio.h>
main()
{
int n = 0, m = 0;
if (n > 0) {
if (m > 0) {
printf("True");
}
} else {
printf("False");
}
}
Es un buen ejemplo de por qué siempre se deben usar paréntesis de usuario en las declaraciones if
.