【发布时间】:2013-11-05 18:30:29
【问题描述】:
我已经阅读了几个关于在 C++ 中显示浮点数的主题,但我找不到令人满意的答案。
我的问题是: 如何在 C++ 中以科学格式(尾数/指数)显示浮点数的所有有效数字?
问题是所有数字在基数 10 中的有效位数都不相同。
例如,double 具有 15 到 17 位有效小数位精度,但 std::numeric_limits<double>::digits10 返回 15,因此,对于某些数字,我将失去 2 个额外的小数位精度。
【问题讨论】:
-
那么,使用
precision(std::numeric_limits<double>::digits10 + 2)?当然,如果最后两位数字是“通过您的计算生成的随机垃圾(例如1.00000000000005 + 100 - 100[假设编译器没有将 +100 - 100 删除为无意义,例如因为这些是当时未知的变量])。它应该注意的是,例如 glibc 的 printf 将产生“垃圾”,如果您将double value = 1.234E+300打印为printf("%f", value);- 将有大约 280 位“随机性”) -
@Mats Petersson 垃圾在旁观者的眼中。如果打印 2^-n 的所有 n 位,则没有一个是垃圾。
-
@RickRegan:所以你认为 1234000000000001278847239713129823712387918732982173971923... 是比 1234000000000000000000000000000000000000000... [我在工作中正在处理的 printf 是在做后者,但当然当我使用 glibc 作为参考时,我必须考虑到差异]。我不知道
cout在这种情况下做了什么。 -
@MatsPetersson:通过计算产生的“随机垃圾”主要出现在
digits10以外的数字中,这通常是错误的。这些数字是在从十进制到浮点的转换中可能不会保留的数字,它们只是受浮点中最小可能舍入影响的数字。一旦执行了不止一次的计算,错误可能会以多种方式复合,产生的复合错误范围从零到无穷大,视情况而定。 -
@MatsPetersson:此外,对于那些了解浮点并仔细使用它的人来说,数字并不是没有意义的。是的,我们使用所有可用信息。除此之外,为了能够再次读取原始数字而需要写入的位数通常超过
digits10。因此,您必须有更多的数字。
标签: c++ floating-point iostream floating-point-precision iomanip