C/Visual C - Tipo de dato Double

 
Vista:
sin imagen de perfil

Tipo de dato Double

Publicado por Mauricio (1 intervención) el 19/11/2013 02:06:42
Necesito ayuda, quiero poder imprimir un valor de un calculo con un tipo de dato double.

Pero al hacerlo me arroja resultados negativos, eso es porque no me permite mostrar todos los valores del numero.

he intentado poner

unsigned double variable;

pero aun asi no logro hacer que almacene un numero con decimales grandes, por ejemplo el: 3.141582827485938392948729294857593928492948593928330204839020923 no logro que lo muestre!


Ayuda por favor! =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Tipo de dato Double

Publicado por Capitan Kirk (97 intervenciones) el 19/11/2013 15:05:20
El tipo unsigned double no existe (a menos que sea muy nuevo).

El tipo double (8 bytes) te va a dar 15-16 cifras significativas, si le pides más simplemente te presentará ceros.

Si necesitas más cifras tienes:

long double es el tipo con el que trabaja internamente la unidad de coma flotante. Son 80 bits (10 bytes), y te daría una precisión de unas 20 cifras significativas. Comprueba que dispones de el realmente, hay compiladores (creo que Visual C es uno de ellos) que te toma el tipo long double como sinónimo de double. Ojo, si compruebas el tamaño podría indicarte que ocupa 12 bytes (96 bits) ó 16 bytes (128 bits) por razones de direccionamiento de memoria, pero solamente te estaría usando los 80 bits.

El compilador GNU C, a partir de la versión 4.3 (creo) tiene un tipo (no estandar) __float128 (comienza con dos guiones bajos), de 128 bits (16 bytes). Con este tipo tendrías unas 34 cifras significativas.

Algunos compiladores disponen de un tipo qfloat de 384 bits (48 bytes) (no, no es un error). Con este tipo dispondrías de unas 100 cifras significativas. Por ejemplo, el compilador LCC-Win32. Es un compilador C (no C++, aunque tiene algunas características de C++), su IDE deja mucho que desear, pero es rápido y ocupa poca memoria.

Si utilizas alguno de estos tipos, ten en cuenta que podrían necesitar especificadores de formato especiales, o versiones especiales de las funciones scanf/printf/cin/cout (y familia) para entrada/salida de datos, consulta los manuales correspondientes.

También puedes utilizar alguna librería de precisión arbitraria, basta con rezar a San Google.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Tipo de dato Double

Publicado por Chema (234 intervenciones) el 19/11/2013 21:43:58
long double aa;
aa = 3.14158282748593839294872929485759392849294859392833020483902092;
printf("%.*Lf\n",51 , aa);/* muestra 51 cifras*/
printf("%d\n",(int)sizeof(aa));/*tamaño = 16*/

Salida en ejecutable compilado en Intel Xeon E3-1200v2 64 bits. sobre Linux Centos 64 bits, compilador GCC (Red Hat 4.4.7-3)
Muestra 51 cifras, las siguientes muestra ceros.
3.141582827485938533840226227766834199428558349609375

Para mostrar completo el número de ejemplo lo mejor es consultar con la N.A.S.A
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tipo de dato Double

Publicado por Capitan Kirk (97 intervenciones) el 21/11/2013 09:04:29
Bueno, mi sistema es de 32 bits, y no sé si los procesadores actuales de 64 bits tienen tipos en coma flotante de más de 80 bits. De todos modos, a partir de la cifra decimal número 16, el número original y el resultado ya son distintos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tipo de dato Double

Publicado por Chema (234 intervenciones) el 21/11/2013 11:12:27
El usuario solicitaba la manera de mostrar los valores.
printf("%.*Lf\n",51 , aa); printf ("%0.30Lf\n",aa); son ejemplos de posibles soluciones.

Otra cosa distinta es la precisión. que queda bien comentada
por capitan.kirk. sólo matizar:

En math.h (http://linux.die.net/include/math.h) están las constantes

16 bytes (long double).
# define M_PI 3.14159265358979323846 /* pi */

Para qien disponga del procesador y compilador adecuados cuadruple precision 128-bit IEEE quad.
/* The above constants are not adequate for computation using `long double's.
Therefore we provide as an extension constants with similar names as a
GNU extension. Provide enough digits for the 128-bit IEEE quad. */

# define M_PIl 3.1415926535897932384626433832795029L /* pi */
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar