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

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

概述我无法相信我无法解决如何做到这一点,但我能说什么,我无法解决这个问题. 我只是想用标准格式编写数字(与科学记数法一样). 我已经阅读了无数的如何使用“setprecision(…)”和“fixed”来实现这一点的例子,但问题是数字的精确度在编译时是未知的并且用’setprecision进入保守估计(…)’留下了大量关于这个地方的多余的零. 这是我所追求的一个例子: let: tau = 6.283 我无法相信我无法解决如何做到这一点,但我能说什么,我无法解决这个问题.
我只是想用标准格式编写数字(与科学记数法一样).

我已经阅读了无数的如何使用“setprecision(…)”和“fixed”来实现这一点的例子,但问题是数字的精确度在编译时是未知的并且用’setprecision进入保守估计(…)’留下了大量关于这个地方的多余的零.

这是我所追求的一个例子:

let: tau = 6.2831tau * 0.000001 -> 0.0000062831tau * 0.001    -> 0.0062831tau            -> 6.2831tau * 1000     -> 6283.1tau * 1000000  -> 6283100

目前我得到:

tau * 0.000001 -> 6.2831e-006tau * 0.001    -> 0.0062831tau            -> 6.2831tau * 1000     -> 6283.1tau * 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的消除不是真的相同(它们作用于确切的十进制表示,他们不会试图找到最简单的一个).

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

总结

以上是内存溢出为你收集整理的c – 如何防止ostringstream(或类似)在没有设置精度的情况下输出科学记数法全部内容,希望文章能够帮你解决c – 如何防止ostringstream(或类似)在没有设置精度的情况下输出科学记数法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存