计算圆周率的数字
Calculating the digits of pi
我已经使用GMP库和c++编写了一个实现高斯-勒让德算法来计算圆周率的数字。
它有正确的输出,但问题是我不知道在哪个点输出"变坏",因为我必须在代码中指定精度。
下面是64位精度的输出:3.141592653589793238*35*,最后两位数字不正确。
我的问题是,如果我想要n个圆周率的数字,那么精度b需要多少位,算法 I 需要多少次迭代?谢谢
Gauss-Legendre算法(又名AGM算法)要求全程完全精确。
不像牛顿法迭代,AGM迭代不能自我修正。所以从一开始就需要完全精确。此外,您还需要额外的保护数字。
我的问题是,如果我想要pi的
n
位,需要多少位精度b
?
首先需要将n
(十进制)数字转换为b
二进制位。也就是:
log(10)
b = n ---------- + epsilon
log(2)
其中epsilon
为保护位数。您需要多少取决于实现和舍入行为,但通常100位对于任何#次迭代都足够了。
至于你需要多少次迭代。这可以由经验证据来证明。
这是我写的一个小应用程序的输出,它使用高斯-勒让德算法将圆周率计算到1亿位数:
================================================================
Computing pi to 100000000 digits:
Threads: 8
Starting AGM... 1.394965 seconds
Starting Iteration 0... -3 (error in decimal digits)
Starting Iteration 1... -9
Starting Iteration 2... -20
Starting Iteration 3... -42
Starting Iteration 4... -85
Starting Iteration 5... -173
Starting Iteration 6... -347
Starting Iteration 7... -696
Starting Iteration 8... -1395
Starting Iteration 9... -2792
Starting Iteration 10... -5586
Starting Iteration 11... -11175
Starting Iteration 12... -22352
Starting Iteration 13... -44706
Starting Iteration 14... -89414
Starting Iteration 15... -178829
Starting Iteration 16... -357661
Starting Iteration 17... -715324
Starting Iteration 18... -1430650
Starting Iteration 19... -2861302
Starting Iteration 20... -5722607
Starting Iteration 21... -11445216
Starting Iteration 22... -22890435
Starting Iteration 23... -45780871
Starting Iteration 24... -91561745
Starting Iteration 25... -183123492
AGM: 118.796792 seconds
Finishing... 3.033239 seconds
Radix Conversion... 2.924844 seconds
Total Wall Time: 126.151086 seconds
CPU Utilization: 495.871%
CPU Efficiency: 61.984%
Writing to "pi.txt"... Done
所以25次迭代足以处理1.83亿个数字。同样,它在每次迭代中都会翻倍,因此您可以运行一些基本的对数数学来计算您需要多少次迭代。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 将圆周率的数字转换为字符数组(不含小数点){c++语言}
- 计算圆周率的数字