c++ - 为什么 cout 的默认精度不影响评估结果?

标签 c++ double precision cout floating-point-precision

这是我的想法:

 #include <iostream>
 #include <iomanip>

  int main ()
 {
    double x = 10-9.99;
   std::cout << x << std::endl;
   std::cout << std::setprecision (16);
   std::cout << x;
   return 0;
  }

上面的程序通过在 setprecision() 之前评估 x 和一个不完全等于 0.01 的长整数来打印 0.01,因为 setprecision() 之后的 x.cout 在我的机器中打印 float 时默认精度为 16。如果精度为 16,上面的值应该类似于 0.0100000000000000 但它仍然是 0.01 但是当我将精度 () 设置为 16 时,程序会打印一个包含 16 位数字的长数字。所以我的问题是,为什么 cout 不根据类型默认精度打印所有数字。为什么我们需要强制 cout(通过使用 setprecision())打印所有数字?

最佳答案

why cout doesn't prints all the digits according to types default precision.

如果您使用 std::fixed 以及 setprecision,它会显示精度要求的任意数字,而不会舍入和截断。

至于为什么四舍五入占输出...

让我们让您的代码也打印一些其他内容:

#include <iostream>
#include <iomanip>

int main ()
{
    double x = 10-9.99;
    std::cout << x << '\n';
    std::cout << std::setprecision (16);
    std::cout << x << '\n';
    std::cout << 0.01 << '\n';
    std::cout << std::setprecision (18);
    std::cout << x << '\n';
    std::cout << 0.01 << '\n';
    std::cout << x - 0.01 << '\n';
}

以及输出(在一个特定的编译器/系统上):

0.01  // x default
0.009999999999999787  // x after setprecision(16)
0.01  // 0.01 after setprecision(16)
0.00999999999999978684   // x after setprecision(18)
0.0100000000000000002    // 0.01 after setprecision(18)
-2.13370987545147273e-16  // x - 0.01

如果我们看看 0.01 是如何以 18 位精度直接编码的...

0.0100000000000000002
   123456789012345678  // counting digits

...我们可以清楚地看到为什么它会在输出期间以任何精度高达 17 时被截断为 "0.01"

您还可以清楚地看到 x 中的值与通过直接编码 0.01 创建的值不同 - 这是允许的,因为它是计算的结果,并且取决于double9.99 的 CPU 寄存器近似值,其中一个或两个都导致了差异。该错误足以阻止以精度 16 舍入到 “0.01”

不幸的是,在处理 doublefloat 时,这种情况很正常。

关于c++ - 为什么 cout 的默认精度不影响评估结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467413/

相关文章:

Java 精度损失

ruby - 指定小数点后有多少个数字

c++ - 这是在 Windows 中将大型 DIB 绘制到屏幕上的最快方法

C++ 重载 (+) 运算符

c++ - 无法为 Boost C++ 库生成 PDF 文档

swift - 如何修复 Swift 对 double 不准确的调试描述?

python - 将浮点值转换为两位小数

c++ - 将对象从 QML 传递到 C++

C# - 数字非常小的问题 - 双数据类型中的数字不足

swift - 转换函数以处理 Double 和 Float...使用 FloatingPoint 类型?