让ChatGTP来为我们写一个计算任意位数圆周率的程序

在这里插入图片描述

最近在学习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位小数。这个值足以绰绰有余地处理大多数日常生活、科学和工程问题。

对于实际应用,如果您需要更高的精度,请使用例如 mpmathDecimal 或其他高精度计算库而不是 Python 自带的浮点数来进行计算,以货真价实的方式获取所需的精确结果。

👦2023/6/5 15:38:38

mpmath 和decimal是如何使用的 请详细说明

🤖2023/6/5 15:39:56

mpmathdecimal 都是 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.pi

print(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 = 0
    k = 0
    while True:
        term1 = (-1) ** k
        term2 = 1 / (2 * k + 1)
        term = term1 * term2
        pi += term
        # 检查是否达到指定精度
        if abs(term) < 10 ** (-precision):
            break    
        k += 1
    return 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再给我们优化一下这个算法,如果喜欢我的文章请大家点赞收藏一下喽,祝大家发大财,行大运~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值