C/C++ especifica dos dígitos como mínimo exponente con printf("%e",...)
. Para imprimir solo 1, y para tratar con Visual Studio que, de forma predeterminada, imprime al menos 3, se necesita un código adicional.
Considere iostreams @Dietmar Kühl
Si el código C++ todavía quiere utilizar printf()
formatos de estilo:
ajustar el valor de un double
antes de llamar printf()
demasiado a menudo da lugar a problemas de redondeo, cortocircuito gama y fracasos de caso general de esquina como tratar con log10(0.0)
. También considere la gran double
justo cerca de una potencia de 10 donde log10()
puede quedar corto, -0.0
, INF
, NAN
.
En este caso, es mejor procesar la cadena.
double var = 1.23e-9;
// - 1 . x e - EEEEE \0
#define ExpectedSize (1+1+1+1+1+1+ 5 + 1)
char buf[ExpectedSize + 10];
snprintf(buf, sizeof buf, "%.1e", var);
char *e = strchr(buf, 'e'); // lucky 'e' not in "Infinity" nor "NaN"
if (e) {
e++;
int expo = atoi(e);
snprintf(e, sizeof buf - (e - buf), "%1d", expo);
}
printf("'%6s'\n", buf); // '1.2e-9'
Nota: %e
es amigable para el procesamiento posterior como su anchura no es tan difícil de manejar como "%f"
. sprintf(buf, "%f", DBL_MAX)
podría ser 1000s de char
.
En realidad, de acuerdo con el estándar y con g ++, debería dar como resultado * dos * dígitos para la parte exponente. –