最近在学习python,突然想编写一个计算圆周率pi的程序,可是对python库不是很熟悉,又不会手撸pi的计算函数所以就想起了ChatGPT,想让他来帮帮忙,顺便学习学习,废话不多说,看聊效!
👦我:2023/6/5 15:33:36
我希望你充当 IT 专家。我会向您提供有关我的技术问题所需的所有信息,而您的职责是解决我的问题。你应该使用你的项目管理知识,敏捷开发知识来解决我的问题。在您的回答中使用适合所有级别的人的智能、简单和易于理解的语言将很有帮助。用要点逐步解释您的解决方案很有帮助。我希望您回复解决方案,而不是写任何解释。
👦GPT:2023/6/5 15:34:48
请帮我编写一个求任意位数圆周率的python程序
🤖2023/6/5 15:35:19
以下是一个简单的 Python 程序,可以计算任意位数的圆周率。请注意:由于圆周率是无穷不循环小数,所以在程序中指定的位数越多,运行时间就会越长。
import math# 计算指定精度的圆周率,默认为50位
def calculate_pi(precision=50):pi_str = str(math.pi)if precision < len(pi_str)-2:return pi_str[:precision+2]else:print("计算将花费一些时间,请耐心等待......")pi_str = str(round(math.pi, precision))return pi_str# 要计算的位数,例如100、500或者1000
precision = 100# 调用函数进行计算并输出结果
result = calculate_pi(precision)
print(result)
只需在 precision
中指定您要计算的位数,即可按照指定精度计算圆周率并将其输出到控制台。如果您愿意,也可以将结果保存在文件中,并对结果进行其他处理。
值得一提的是,此程序应该可以满足您的需求,但需要注意,在实际计算时要考虑到Python中浮点数的精度问题。在根据预设精度向下舍入过程中可能引入微小误差。
👦2023/6/5 15:35:49
其中的math.pi是如何具体实现的
🤖2023/6/5 15:36:09
math.pi
是 Python 3 标准库中的 math
模块中预定义的圆周率常量。在Python安装后,内建的标准库就已经具备该常量以及其他常见的数学函数。
事实上,圆周率是一个无限不循环小数,如果要计算精确值需要进行一系列复杂的推导和运算。Python 的 math.pi
常量,其值被预设为15位小数。这个值足以绰绰有余地处理大多数日常生活、科学和工程问题。
对于实际应用,如果您需要更高的精度,请使用例如 mpmath
、Decimal
或其他高精度计算库而不是 Python 自带的浮点数来进行计算,以货真价实的方式获取所需的精确结果。
👦2023/6/5 15:38:38
mpmath 和decimal是如何使用的 请详细说明
🤖2023/6/5 15:39:56
mpmath
和 decimal
都是 Python 中常用的高精度计算库。它们可以用于处理需要比 Python 内置浮点类型更高精度的任何问题,和前面提到的 math
模块不同,这两个库会在内部将数字存储为文本形式,并且通过自定义算法提供高精度的计算功能。
下面简单介绍这两个库的使用方法:
mpmath安装
使用 pip
可以在命令行上快速安装 mpmath
:
pip install mpmath
若由于网络原因无法正常安装,请尝试在命令行添加 -i
参数,指定安装源为豆瓣镜像:
pip install -i https://pypi.doubanio.com/simple/ mpmath
- 基础操作
让我们从一个简单的例子开始,计算 100 位圆周率:
import mpmath# 将结果保留 100 位小数
mpmath.mp.dps = 100# 计算圆周率
pi = mpmath.piprint(pi)
上述代码中,首先我们通过设置 mpmath.mp.dps
属性将计算的精度设置为 100 位。然后调用 mpmath.pi
函数计算圆周率,将其存储在变量 pi
中。最后,将结果输出到屏幕上。
- 更多操作
mpmath
库为解决不同领域的问题提供了丰富的函数和常量集,包括:三角函数、指数函数、对数、统计分布等,具体支持列表可以参考 mpmath
文档 https://mpmath.org/doc/current/functions/index.html
decimal 安装
使用 pip
可以在命令行上快速安装 decimal
:
pip install decimal
若由于网络原因无法正常安装,请尝试在命令行添加 -i
参数,指定安装源为豆瓣镜像:
pip install -i https://pypi.doubanio.com/simple/ decimal
- 基础操作
以下代码片段实现了计算圆周率的基本示例,将其打印到输出中(精度设置为 100 位):
import decimal# 手动设置上下文精度
decimal.getcontext().prec = 100# 计算并输出圆周率
pi = decimal.Decimal(0)for k in range(100):pi += (decimal.Decimal(1) / 16 ** k) * (decimal.Decimal(4) / (8 * k + 1) -decimal.Decimal(2) / (8 * k + 4) -decimal.Decimal(1) / (8 * k + 5) -decimal.Decimal(1) / (8 * k + 6))print(pi)
上述代码中,首先通过 decimal
模块中的 getcontext()
函数获取当前上下文。在此上下文中,通过设置其精度来决定后续计算的精确度。
然后我们计算 100 位圆周率,可以看到我们使用了一个迭代方法来逐步逼近该值。最后,我们将结果输出到屏幕上。
- 更多操作
decimal
模块支持各种数学函数和运算符,包括常见算术运算、三角函数、对数等。关于 decimal
库更详细的介绍和使用方法可以参考官方文档 https://docs.python.org/3/library/decimal.html 。
👦2023/6/5 15:41:04
那如果不用python库 自己写一个计算任意位数的圆周率的程序该怎么写呢
🤖2023/6/5 15:41:39
计算圆周率的方法有很多种,其中最常见的方法之一是使用莱布尼茨级数。这个方法可以实现任意精度的圆周率计算,并且不需要使用任何 Python 库。
下面是一个用 Python 编写的示例代码:
def calc_pi(precision):"""计算 pi 的值"""pi = 0k = 0while True:term1 = (-1) ** kterm2 = 1 / (2 * k + 1)term = term1 * term2pi += term# 检查是否达到指定精度if abs(term) < 10 ** (-precision):break k += 1return pi * 4# 测试
print(calc_pi(100))
上述代码中,我们定义了一个函数 calc_pi
,该函数接受一个参数 precision
表示要计算的圆周率的精度,精度表示在小数点后保留几位有效数字。
在函数体内,我们运用了莱布尼茨级数的思想来实现对 pi 的计算,具体做法是通过反复累加级数项来逐步接近 pi,直至达到所需的精度,然后乘以 4 得到最终的圆周率值。
在主程序中,我们演示了如何调用该函数并打印出 100 位的圆周率。当然,通过适当调节参数 precision
值,我们可以得到任意精度的圆周率。
测试发现时间复杂度太高,让机器为我们翻译为C语言:
经过测试呢前两个程序都没有问题能够输出预期的结果,就是最后的莱布尼茨级数法的计算速度实在是太慢了,难道是python的原因?那我们用纯C来试一下是不是可以快一点呢:
👦2023/6/5 16:49:47
那能否帮我把那个计算程序翻译成c语言呢
🤖2023/6/5 16:50:20
当然可以,以下是一个使用 C 语言编写的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>double calc_pi(int precision) {double pi = 0;int k;for (k = 0; k < precision; k++) {int sign = (k % 2 == 0 ? 1 : -1);double term = sign * 1.0 / (2 * k + 1);pi += term;}return pi * 4;
}int main() {double pi = calc_pi(100);printf("%.100f\n", pi);return 0;
}
在上述代码中,我们通过循环逐步累加级数项来实现圆周率的计算,并返回最终的值。主程序部分演示了如何调用该函数并输出 100 位有效数字的圆周率的值。
需要注意的是,C 语言的准确度可能不如 Python 高,并且 C 语言中没有小数类型,所以我们必须手动计算整数和浮点数之间的转换。此外,在 C 语言中,我们也需要使用 if 语句来实现条件判断。
如果您需要高精度计算圆周率,可以考虑使用 GNU Multiple Precision Arithmetic Library(GMP)等第三方库来处理大量数字,或者手动实现更多细节,例如 Karatsuba 等算法。
ps
通过以上应用,我们可以看到GPT还是很牛的,而且我已经在VScode中验证了它所给的代码都可以正确运行,没有bug,大家也可以测试一下,明天咱们让GPT再给我们优化一下这个算法,如果喜欢我的文章请大家点赞收藏一下喽,祝大家发大财,行大运~