Junio 24, 2018, 10:39:12 am

Autor Tema: "Problema" en C++  (Leído 5666 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
"Problema" en C++
« en: Enero 06, 2018, 09:32:50 pm »
El siguiente código (muy simple) parecería dar NO pero la respuesta es YES:

Código: (c++) You are not allowed to view links. Register or Login
#include <stdio.h>

void main(){

        float a=0.7;
        if (a<0.7){
                printf("yes \n");
        }else{
                printf("no \n");
        }

}

Todo indicaría que va a dar "NO" pero devuelve "YES".
Si cambiamos el tipo "float" por "double" efectivamente la respuesta es "NO".
Bueno la idea es que alguien comente por qué sucede esto.

Saludos

Not for the money, not for the fame. Not for the power, just no more games.

Desconectado .:MYTO:.

  • Me das tu IP?
  • *
  • Mensajes: 195
  • Sexo: Masculino
  • Hunt3r m1nd 1s 0nly f0r f3w...
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #1 en: Enero 07, 2018, 04:09:55 am »
¿Puede que sea por la precisión al guardarlo en memoria?

Haz un printf para a, si es eso te saldrá algo como 0.69999999999999

Salu2
Debería estar estudiando...

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #2 en: Enero 07, 2018, 01:19:00 pm »
Hola, creo que se almacena así como tu dices.
Sin embargo si lo muestro así:

printf ("%f", a);

Imprime: 0.700000

PS: Quizás con cheat engine se podría ver bien el valor.

Saludos
« Última modificación: Enero 07, 2018, 02:56:53 pm por Solid Water »

Desconectado .:MYTO:.

  • Me das tu IP?
  • *
  • Mensajes: 195
  • Sexo: Masculino
  • Hunt3r m1nd 1s 0nly f0r f3w...
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #3 en: Enero 08, 2018, 09:11:40 am »
Prueba con

printf("%20.10f", a);


Salu2

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #4 en: Enero 08, 2018, 10:05:00 am »
Muy bien, ahí está perfecto.

Imprime: 0.6999999881

Aunque me sigo preguntando por qué lo almacenan así.

Saludos,

Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1773
  • Sexo: Masculino
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #5 en: Enero 08, 2018, 12:26:24 pm »
en binario 7/10 es una fracción periodica infinita, similar a lo que en decimal es 1/3 o 1/6.
por lo que se debe redondear.

Pasa que le estás comparando con un numero literal "0.7" que el compilador asume como double (es la precisión prederminada cuando no se aclara), por lo que redondea con más precisión, y en este caso queda mayor que el float.

Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>

int main(){

  float a=0.7;

  if (a<0.7)
printf("yes \n");
  else
printf("no \n");

  if (a<0.7f)
printf("yes \n");
  else
printf("no \n");

  return(0);
}

PD: cuando conversabamos sobre este código no recordaba como hacer que el número literal sea un float.

Desconectado .:MYTO:.

  • Me das tu IP?
  • *
  • Mensajes: 195
  • Sexo: Masculino
  • Hunt3r m1nd 1s 0nly f0r f3w...
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #6 en: Enero 08, 2018, 01:00:19 pm »
 Un detalle que he descubierto a raíz de esto:

float a = 0.7;

está inicializando una variable float (a) con un double (0.7) y haciéndose downcast a float.
 La manera correcta entonces sería:

float a = 0.7f;

inicializando así una variable float (a) con un float (0.7f).
 El downcast del primer método produce una pérdida de eficiencia, aunque evidentemente el impacto es minúsculo por lo que en realidad no tiene mucha importancia.

Salu2.

Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1773
  • Sexo: Masculino
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #7 en: Enero 09, 2018, 03:20:52 pm »
pensaba que en la asignación el compilador se iba a encargar de corregir eso ...

habría que mirar el ASM generado.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #8 en: Enero 09, 2018, 03:30:24 pm »
Bueno el tema está más que solucionado.
No esperaba encontrar respuestas tan buenas.

Saludos,

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #9 en: Enero 25, 2018, 10:39:24 pm »
Quería decirles que este post seguramente va a aparecer en mi página web.
Me gustaría que .:MYTO:. me envíe un avatar y una firma.



PD: No uso el MP por que se tiene que loguear y no lo va a ver.
Si no quiere ponerse avatar y firma o que le ponga un nombre anónimo no importa como el quiera, es libre.

Saludos muchachos,

Desconectado .:MYTO:.

  • Me das tu IP?
  • *
  • Mensajes: 195
  • Sexo: Masculino
  • Hunt3r m1nd 1s 0nly f0r f3w...
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #10 en: Enero 26, 2018, 04:18:03 am »
 Has acertado Solid, no habría visto el MP. Ya te he respondido.

 En cuanto a lo que dice jep (para no irnos mucho off-topic): tiene razón. Gcc optimiza la asignación automáticamente. Supongo que cualquier otro compilador del estándar de C (que no sé cuál es... ¿ANSI C?) también lo optimizará.


Salu2.

Desconectado jep

  • Night Elf Druid
  • Colaborador
  • ****
  • Mensajes: 1773
  • Sexo: Masculino
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #11 en: Enero 30, 2018, 11:57:41 am »
Excelente la web Solid!

 8)

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1133
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:"Problema" en C++
« Respuesta #12 en: Febrero 14, 2018, 05:46:34 pm »
Pueden ver como quedó este post en mi web You are not allowed to view links. Register or Login

No DOSEEN petinatos  :P

Saludos,