如何防止ostringstream(或类似)在没有设置精度的情况下输出科学记数法
How to prevent ostringstream (or similar) from outputting scientific notation WITHOUT setting precision
我不敢相信我不知道怎么做,但我能说什么呢,我不知道。我只是想用标准格式写数字(相当于科学记数法)。
我读过无数关于如何使用"setprecision(…)"answers"fixed"等实现这一目标的例子,但问题是,在编译时,数字的精度是未知的,使用"setprecision(..)"输入保守估计会在这个地方留下大量多余的零。
下面是我想要的一个例子:
let: tau = 6.2831
tau * 0.000001 -> 0.0000062831
tau * 0.001 -> 0.0062831
tau -> 6.2831
tau * 1000 -> 6283.1
tau * 1000000 -> 6283100
此刻我得到:
tau * 0.000001 -> 6.2831e-006
tau * 0.001 -> 0.0062831
tau -> 6.2831
tau * 1000 -> 6283.1
tau * 1000000 -> 6.2831e+006
我唯一能做的就是以某种方式提取二重的指数,如果指数为正,则将精度"固定"为零,否则将精度设置为"-1*exp";但这似乎是一种极其复杂的"关闭"科学记数法的方法。有人知道更好的方法吗?
虽然大多数十进制分数不能用二进制FP数准确表示,而准确表示二进制FP数可能会产生很多数字,存在将二进制FP格式化为最简单的十进制数的算法,假设输入时具有给定的分组模式(即6.283100128173828125将被格式化为6.2831,但是下一个可表示的FP数将被格式化成6或7位数字),二进制FP将被读回为原始FP。
遗憾的是,C++(和C)中格式化的IO无法要求应用这些算法。printf的%g
和IOStream的默认设置是最接近的,但它们与固定和科学记数法之间的自动选择相结合,它们需要最大的精度,并且省略结束0
的限制实际上并不相同(它们作用于精确的十进制表示,它们不试图找到最简单的表示)。
请注意,这些算法并不简单,它们需要多精度算法。
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 在 c++ 中在开关情况下使用和不使用"break"时的不同输出
- 为什么在这种情况下,bool 类型的输出等于 0?
- CMake:默认情况下,如何使add_custom_command输出保持最新?
- 如何在不丢失输出的情况下杀死/停止终端中正在运行的进程?
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 两种情况下的输出不应该相同吗?
- STL:在没有输出的情况下处理两个集合
- 在存在错误代码的情况下输出参数与 NRVO
- 如何输出a'&quot在不使用线端的情况下进行文件
- 如何在不将其连接到终端的情况下运行'screen',以便我可以在C++ (qt) 应用程序中捕获输出?
- 为什么在浮点比较中,最后一个小数位数为5的浮点值能给出正确的输出,而在其他情况下却不是
- 在SEGFAULT的情况下,了解GDB输出
- 如何在不移动C 中的光标坐标的情况下输出文本以控制特定坐标
- 如何仅在对象存在/特定情况下输出对象的某个部分?
- 如何在不破坏现有代码的情况下将输出参数添加到功能
- 如何在不reinterpret_cast的情况下将未签名的 char* 输出到文件
- 默认情况下构造函数插入数据后,我没有得到任何输出,但我不确定为什么不
- 在任何情况下都会出现意外输出.我的解决方案出了什么问题
- c++套接字客户端在输出流关闭的情况下不断从Java服务器事件中接收一些内容