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的消除不是真的相同(它们作用于确切的十进制表示,他们不会试图找到最简单的一个). 请注意,这些算法并不简单,它们需要多精度算法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |