Skip to content

Instantly share code, notes, and snippets.

@phaya phaya/wrongseconds.c Secret
Last active Dec 22, 2015

Embed
What would you like to do?
¿Por qué en el siguiente programa la conversión a segundos es errónea para 100 años?
#include <stdio.h>
int main()
{
int age;
printf("How old are you?\n");
scanf ("%d", &age);
printf("You are over %d seconds old\n", age*365*24*60*60);
return 0;
}
@ArturoBlazquez

This comment has been minimized.

Copy link

ArturoBlazquez commented Sep 28, 2013

La conversión a segundos es incorrecta porque sobra el 12 de la multiplicación.
Además el programador no está teniendo en cuenta que los años bisiestos tienen 366 días en vez de 365.

@phaya

This comment has been minimized.

Copy link
Owner Author

phaya commented Sep 28, 2013

ups...no se en que estaría pensando. He quitado la multiplicación por 12 que efectivamente estaba mal. Ignorando el hecho de que algunos años son bisiestos si pruebas con 100 años verás que el cálculo no se aproxima ni por asoma al cálculo real.

@javierdarna

This comment has been minimized.

Copy link

javierdarna commented Sep 29, 2013

Creo que es porque para 100 años se ha excedido la capacidad de representación de un int, pero no estoy seguro...

@phaya

This comment has been minimized.

Copy link
Owner Author

phaya commented Sep 30, 2013

¡Muy bien! Pero con un ligeros matices, primero la representación de un int varía según la plataforma. En los laboratorios ocupan 4 bytes (32 bits) Si se emplearan más bytes puede que no diera problemas. Para comprobar cuantos byes ocupa un entero lo más rápido es printf("%d", sizeof(int). Segundo, en este caso el problema no viene por int age si no por el resultado de la operación age*365*24*60*60 que es lo que desborda. Fijaros que especificador de formato se emplea en printf¿cómo solucionarías el código para obtener la salida correcta que para 100 años es 3153600000?

@anacidoncha

This comment has been minimized.

Copy link

anacidoncha commented Sep 30, 2013

Creo que habría que poner como formato %lf tanto en el printf como en el scanf y declarar age como double

@phaya

This comment has been minimized.

Copy link
Owner Author

phaya commented Sep 30, 2013

¡Bien! Esa solución funciona y arregla el problema, pero se puede hacer sin tocar el tipo de datos de age, y manteniendo la salida del programa como un entero, en vez de un float ¿qué otros especificadores de formato se pueden utilizar con números enteros?

@anacidoncha

This comment has been minimized.

Copy link

anacidoncha commented Oct 1, 2013

Vale, creo que sería utilizando %u pues al no tener signo digamos que ampliamos el rango al doble (el de los positivos). No sé si me he explicado.

@phaya

This comment has been minimized.

Copy link
Owner Author

phaya commented Oct 1, 2013

Tocado y hundido

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.