如何防止ostringstream(或类似)在没有设置精度的情况下输出科学记数法

How to prevent ostringstream (or similar) from outputting scientific notation WITHOUT setting precision

本文关键字:输出 情况下 精度 设置 ostringstream 何防止      更新时间:2023-10-16

我不敢相信我不知道怎么做,但我能说什么呢,我不知道。我只是想用标准格式写数字(相当于科学记数法)。

我读过无数关于如何使用"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的限制实际上并不相同(它们作用于精确的十进制表示,它们不试图找到最简单的表示)。

请注意,这些算法并不简单,它们需要多精度算法。

相关文章: