Quiero controlar la cantidad de dígitos de exponente después de 'e' en C printf %e ?
Por ejemplo, C printf("%e") da como resultado 2.35e+03 , pero quiero 2.35e+003 , necesito 3 dígitos de exponente, ¿cómo uso printf ?
Código:
#include<stdio.h> int main() { double x=34523423.52342353; printf("%.3g\n%.3e",x,x); return 0; }Resultado: http://codepad.org/dSLzQIrn
3.45e+07 3.452e+07deseo
3.45e+007 3.452e+007Pero, curiosamente, obtuve los resultados correctos en Windows con MinGW.
"...El exponente siempre contiene al menos dos dígitos, y solo tantos dígitos más como sea necesario para representar el exponente. ..." C11dr §7.21.6.1 8
Entonces 3.45e+07 cumple (lo que OP no quiere) y 3.45e+007 no cumple (lo que OP quiere).
Como C no proporciona una forma estándar para que el código altere el número de dígitos del exponente, el código debe valerse por sí mismo.
Varios compiladores admiten cierto control.
estudio visual _set_output_format
Por diversión, el siguiente es un código de bricolaje
double x = 34523423.52342353; // - 1 . xxx e - EEEE \0 #define ExpectedSize (1+1+1 +3 +1+1+ 4 + 1) char buf[ExpectedSize + 10]; snprintf(buf, sizeof buf, "%.3e", x); 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), "%05d", expo); // 5 more illustrative than 3 } puts(buf); 3.452e00007También vea c ++ cómo obtener "exponente de un dígito" con printf
prototipo de etiquetas de formato printf :
%[flags][width][.precision][length]specifierla precisión
... Esto da ... el número de dígitos que aparecerán después del carácter base para las conversiones a, A, e, E, f y F ... .
Está utilizando la conversión y el especificador de precisión correctamente, la diferencia está en las implementaciones de la función de biblioteca C y los entornos en los diferentes sistemas. La precision especifica el número de dígitos después de '.' (punto, punto, etc.). No establece el número de caracteres que representan la exponenciación. El hecho de que proporciona 3 digits en Windows es solo la forma en que Windows especifica el formato, no la forma en que la biblioteca estándar de C especifica que funcionará printf .
Sería necesario comparar cómo difieren las implementaciones de origen para ver en qué se basa esa parte de la cadena de formato. (Probablemente se reducirá a alguna oscura diferencia en la forma en que se definen o especifican los entornos de Windows v. Linux/Unix/locale/etc.)
char *nexp(double x, int p, int n) // Number with p digits of precision, n digits of exponent. { const int NN=12; static char s[NN][256];//(fvca) static int i=-1; int j,e; i=(++i)%NN; // Index of what s is to be used... sprintf(s[i],"%.*lE", p,x); // Number... for(j=0; s[i][j]; j++) if(s[i][j]=='E') break; // Find the 'E'... if(s[i][j]=='E') // Found! { e= atoi(s[i]+j+1); sprintf(s[i]+j+1, "%+0*d", n+1,e); return s[i]; } else return "***"; } // Best Regards, GGa // G_G