sstream poner notacion mostrar imprimir float example español dev decimales como cientifica c++ format double

c++ - poner - Cómo evitar que ostringstream(o similar) genere notación científica SIN establecer la precisión



stringstream example (1)

No puedo creer que no pueda entender cómo hacerlo, pero qué puedo decir, no puedo resolverlo. Estoy tratando de escribir números en formato estándar (como apposed a la notación científica).

He leído innumerables ejemplos de cómo lograr esto usando "setprecision (...)" y "fixed" y cosas, pero el problema es que la precisión de los números no se conoce en tiempo de compilación e ingresa una estimación conservadora con ''setprecision'' (...) ''deja montones de ceros superfluos sobre el lugar.

Aquí hay un ejemplo de lo que estoy buscando:

let: tau = 6.2831 tau * 0.000001 -> 0.0000062831 tau * 0.001 -> 0.0062831 tau -> 6.2831 tau * 1000 -> 6283.1 tau * 1000000 -> 6283100

En este momento tengo:

tau * 0.000001 -> 6.2831e-006 tau * 0.001 -> 0.0062831 tau -> 6.2831 tau * 1000 -> 6283.1 tau * 1000000 -> 6.2831e+006

Lo único que puedo hacer es extraer de alguna manera el exponente del doble, y si el exponente es positivo, "fijar" la precisión a cero; de lo contrario, establecer la precisión en ''-1 * exp''; pero esto parece una forma extremadamente intrincada de ''desviar'' la notación científica. Alguien sabe una mejor manera?


Si bien la mayoría de las fracciones decimales no se pueden representar exactamente con un número FP binario, y representar exactamente un número FP binario puede dar como resultado muchos dígitos, existen algoritmos para formatear un FP binario como el número decimal más simple que se leerá como el FP original asumiendo un modo de ruteo dado en la entrada (es decir, 6.283100128173828125 tendrá el formato 6.2831, pero el siguiente número FP representable tendrá un formato de 6 o 7 dígitos).

Lamentablemente, IO formateado en C ++ (y en C) no tienen forma de pedir que se apliquen esos algoritmos. %g de printf y la configuración predeterminada de IOStream es la más cercana disponible, pero se combinan con una elección automática entre notación fija y científica, necesitan una precisión máxima y la eliminación de la terminación 0 no es realmente la misma (actúan en la representación decimal exacta, no intentan encontrar la más simple).

Tenga en cuenta que esos algoritmos no son realmente simples, necesitan aritmética de multiprecision.