1

我编写了一个程序来使用 Gregory Leibniz 公式估算 pi,但是,它不会计算到小数点后 18 位。它最多只能计算 5 个小数点。有什么建议么?

4

2 回答 2

4

利用

cout.precision(50);

提高打印输出的精度。这里 50 是输出中的小数位数。

于 2013-09-30T04:18:00.677 回答
0

默认打印精度6printf

精度指定小数点字符后出现的确切位数。默认精度为 6

类似地,当std::cout引入 C++ 时,使用相同的默认值

管理由 执行的浮点输出的精度(即生成多少位数)std::num_put::do_put

  1. 返回当前精度。
  2. 将精度设置为给定的精度。返回前一个精度。

由 建立的默认精度std::basic_ios::init为 6。

https://en.cppreference.com/w/cpp/io/ios_base/precision

因此,无论类型多么精确,都只会打印出 6 个小数位。要获得更多数字,您需要使用std::setprecisionstd::cout.precision

但是调用只影响输出std::cout.precision中的小数位数,而不影响数字的实际精度。超过该类型精度的任何数字都只是垃圾

大多数现代系统使用 IEEE-754,其中23 位尾数float单精度double的,而尾数是 52 位的双精度。因此,它们分别精确到 ~6-7 位和 ~15-16 位十进制数字。这意味着它们不能像您预期的那样将数字表示为小数点后 18 位

在某些平台上可能有一些扩展精度类型,因此您将能够更精确地存储数字。例如long double,在 x86 上的大多数编译器上,精度为 64 位,可以表示 ~18 位有效数字,但它不是小数点后的 18 位数字。在某些编译器上,可以通过四倍精度获得更高的精度。要达到更高的精度,唯一的方法是使用一个大数字库或为自己编写一个。

于 2013-09-30T06:37:58.670 回答