加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何防止ostringstream(或类似)在没有设置精度的情况下输出

发布时间:2020-12-16 06:59:22 所属栏目:百科 来源:网络整理
导读:我无法相信我无法解决如何做到这一点,但我能说什么,我无法解决这个问题. 我只是想用标准格式编写数字(与科学记数法一样). 我已经阅读了无数的如何使用“setprecision(…)”和“fixed”来实现这一点的例子,但问题是数字的精确度在编译时是未知的并且用’setpr
我无法相信我无法解决如何做到这一点,但我能说什么,我无法解决这个问题.
我只是想用标准格式编写数字(与科学记数法一样).

我已经阅读了无数的如何使用“setprecision(…)”和“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

我唯一能做的就是以某种方式提取double的指数,如果指数为正,则将’fix’的精度设置为零,否则将精度设置为’-1 * exp’;但这似乎是一种非常复杂的“关闭”科学记数法的方法.
谁知道更好的方法?

解决方法

虽然大多数小数部分不能用二进制FP编号精确表示,并且准确表示二进制FP编号可能导致大量数字,但是有一些算法可以将二进制FP格式化为最简单的十进制数字,它将作为原始FP在输入时假定给定的路由模式(即6.283100128173828125将被格式化为6.2831,但下一个可表示的FP号将被格式化为6或7位).

遗憾的是,在C(和C)中格式化的IO无法要求应用这些算法. printf的%g和IOStream的默认设置是最接近的可用,但是它们与固定和科学记数法之间的自动选择相结合,它们需要最大精度并且结束0的消除不是真的相同(它们作用于确切的十进制表示,他们不会试图找到最简单的一个).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读