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.