no se puede imprimir correctamente un doble largo en C
long-double (1)
Hay un problema similar con MinGW en Windows. Si eso no es lo que está usando, esta respuesta probablemente no se aplique.
El problema es que el compilador (GCC) y la biblioteca de tiempo de ejecución (Microsoft) están implementados por diferentes grupos que tienen diferentes ideas sobre cómo debe representarse el tipo
long double
.
(gcc usa 128 bits para el
long double
; Microsoft usa 64 bits, con la misma representación que el
double
).
Cualquiera de las opciones de representación es perfectamente legítima, pero son incompatibles entre sí. No es un error ni en GCC ni en la biblioteca de Microsoft, sino en la forma en que MinGW los integra.
Sus opciones son usar una implementación que no sea MinGW, escribir o copiar código que maneje
long double
correctamente, o evitar llamar a cualquier función de biblioteca que tome argumentos o devuelva resultados de tipo
long double
(los cálculos en
long double
no deberían ser un problema siempre y cuando no llamen a ninguna función de biblioteca).
Por ejemplo, puede convertir a
double
e imprimir con
%g
, con alguna pérdida de rango y precisión.
Otra solución (probablemente mejor) es compilar con
-D__USE_MINGW_ANSI_STDIO
, lo que hace que MinGW use su propia implementación de
printf
y amigos en lugar de confiar en la implementación de Microsoft.
Estoy intentando imprimir un doble largo simple, pero no funciona
Lo que probé:
long double ld=5.32;
printf("ld with le = %Le /n",ld);
printf("ld with lf = %Lf /n",ld);
printf("ld with lg = %Lg /n",ld);
Salida:
ld with le = -3.209071e-105
ld with lf = -0.000000
ld with lg = -3.20907e-105
Con un nuevo valor:
ld=6.72;
Salida:
ld with le = -1.972024e+111
ld with lf = -1972024235903379200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
ld with lg = -1.97202e+111