在 Python 中用多边形计算 Pi

2024-04-03

我在精确计算 Pi 时遇到问题。 我使用的方法是,我得到一个半径为 1 的圆,并在其内部放置具有 8、16、32、64、... 角的多边形,在每个步骤后将它们加倍。 但问题是结果只有前15位小数是正确的。

这是程序:

import math
import time
from decimal import *

n_Ecken = 8

while n_Ecken >=8:
    time.sleep(0.5)
    n_Ecken = n_Ecken * 2

    def berechneAlpha():
        kreis = 360                                                                 
        alphaInsideFunc = Decimal(kreis) / Decimal(n_Ecken)                         
        return alphaInsideFunc                                                      
    alphaOutsideFunc = berechneAlpha()


    def berechneBeta():                                                             
        betaInsideFunc = Decimal(alphaOutsideFunc) / Decimal(2)                      
        return betaInsideFunc                                                       
    betaOutsideFunc = berechneBeta()                                                


    def berechneKantenlaenge():                                                     
        Gegenkathete = Decimal(math.sin(math.radians(betaOutsideFunc)))             
        KantenlaengeInsideFunc = Gegenkathete * 2                                   
        return KantenlaengeInsideFunc                                               
    KantenlaengeOutsideFunc = berechneKantenlaenge()                                


    def berechneUmfang():                                                           
        UmfangInsideFunc = n_Ecken * KantenlaengeOutsideFunc                        
        return UmfangInsideFunc                                                     
    UmfangOutsideFunc = berechneUmfang()                                            


    def berechnePi():                                                               
        PiInsideFunc = UmfangOutsideFunc / 2                                        
        return PiInsideFunc                                                         

    getcontext().prec = 500
    print Decimal(berechnePi())
    print "Zahl der Ecken:", n_Ecken

我希望你能理解它,因为它部分是用德语写的:D 它所做的就是取一个八边形,将 360° 除以角数(前 8 个),然后除以 2。22.5° 的角度是程序现在将结果放入正弦中以计算 1/16 的范围八边形,然后再次将结果加倍并乘以多边形的角数。在最后一步(在顶部 ^^)中,它将多边形中的角数加倍,并再次运行所有这些步骤。

以下是前几个步骤的一些结果:

3.121445152258051969340613141
Zahl der Ecken: 16

3.1365484905459393161208936362527310848236083984375
Zahl der Ecken: 32

3.1403311569547529558121823356486856937408447265625
Zahl der Ecken: 64

3.14127725093277287982118650688789784908294677734375
Zahl der Ecken: 128

3.1415138011443008991818715003319084644317626953125
Zahl der Ecken: 256

3.141572940367091337776628279243595898151397705078125
Zahl der Ecken: 512

3.14158772527715957068039642763324081897735595703125
Zahl der Ecken: 1024

3.141591421511199744287523571983911097049713134765625
Zahl der Ecken: 2048

3.1415923455701175726062501780688762664794921875
Zahl der Ecken: 4096

3.14159257658487245379319574567489326000213623046875
Zahl der Ecken: 8192

3.141592634338562728402166612795554101467132568359375
Zahl der Ecken: 16384

3.141592648776985630121316717122681438922882080078125
Zahl der Ecken: 32768

3.14159265238659113350649931817315518856048583984375
Zahl der Ecken: 65536

3.14159265328899284241970235598273575305938720703125
Zahl der Ecken: 131072

3.1415926535145928255587932653725147247314453125
Zahl der Ecken: 262144

3.14159265357099304338817091775126755237579345703125
Zahl der Ecken: 524288

3.141592653585093319890120255877263844013214111328125
Zahl der Ecken: 1048576

3.14159265358861805594870020286180078983306884765625
Zahl der Ecken: 2097152

3.141592653589499573030252577154897153377532958984375
Zahl der Ecken: 4194304

3.141592653589719841278338208212517201900482177734375
Zahl der Ecken: 8388608

3.141592653589774908340359615976922214031219482421875
Zahl der Ecken: 16777216

3.14159265358978867510586496791802346706390380859375
Zahl der Ecken: 33554432

3.141592653589791783730333918356336653232574462890625
Zahl der Ecken: 67108864

3.141592653589792671908753618481568992137908935546875
Zahl der Ecken: 134217728

3.141592653589793115997963468544185161590576171875
Zahl der Ecken: 268435456

3.141592653589793115997963468544185161590576171875
Zahl der Ecken: 536870912

最后 2 个结果完全相等且错误。这是正确的部分:3.141592653589793,其余部分则不正确。为什么?

通常它会重复打印结果的最后一行,末尾有很多零,因为我设置了“getcontext().prec = 500”。

我做错了什么?

我对 Python 和一般编程不太有经验。 请不要向我展示其他计算它的可能性,因为它必须是这个(对于学校)。

UPDATE:使用 mpmath 模块解决了问题。错误在于 math.sin() 函数中的构建在计算这些微小角度时不够精确。只需导入“mpmath”而不是“math”和“decimal”并写入 mp.sin()。


您仅将 getcontext 用于 Decimal 对象,但是当您使用传统数学函数时,您会失去精度。只是64 位浮点数提供 15 - 17 位有效小数位精度 https://en.wikipedia.org/wiki/Double-precision_floating-point_format.
也许,你可以尝试交错模块 http://docs.sympy.org/latest/modules/evalf.html以获得比符号表达式更精确的近似值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中用多边形计算 Pi 的相关文章

随机推荐

  • `.create()` 方法默认不支持可写嵌套字段。

    关于 DRF 中与中间模型的多对多关系的序列化 我有一个大问题 如果请求方法是 get 则一切正常 但是当我尝试将数据发布或放置到 API 时 我收到以下错误 Traceback most recent call last File Lib
  • ASP.NET MVC4 捆绑单个文件

    有没有办法使用 MVC4 中的新捆绑功能来捆绑单个文件 我知道捆绑单个文件没有多大意义 但我想使用服务器端缩小并让 MVC 在 URL 末尾附加哈希以用于缓存目的 我已经尝试过 Scripts Url Scripts myscript js
  • iOS7 中非消耗性产品的服务器端收据验证和 transactionReceipt 弃用

    我正在从以前的 iOS 移植一个工作应用程序 但在处理新的应用程序内购买收据时遇到了问题 我们现在的工作方式是从SKPaymentTransaction对象并将其发送到服务器进行验证 从我从其他问题中收集到的信息来看 收据现在似乎保存在一个
  • Android studio 1.4 和矢量图像

    今天我将android studio更新到1 4版本 我在变更日志中看到 您也可以为 api Error Execution failed for task app transformClassesWithDexForDebug gt co
  • Eclipse Java IDE JUnit5:junit.jupiter.api.Assertions 不可访问

    我对整个编程很陌生 但这是我的问题 我曾经通过右键单击项目在 Eclipse 中添加 JUnit 测试用例 然后添加新增 gt JUnit 测试用例 目前 我无法实现任何测试方法 因为 Eclipse 在线告诉我 import static
  • FPDF/FPDI 错误:致命错误:找不到类“setasign\Fpdi\FpdfTpl”

    我正在尝试为现有的 PDF 文档添加水印 这个错误在过去两天一直困扰着我 我的 FPDI 库位于 fpdi src 中 fpdf 库位于 fpdf 中 引发错误的文件是 Fpdi php 第 27 行 以下是前 30 行
  • Java 中的 tan() 返回一个奇怪的值

    我的代码将一个以弧度为单位的角度传递给cos tan and sin 一切似乎都工作正常 除了晒黑90 这给出了值16331239353195370由于某些奇怪的原因 示例代码 import java text DecimalFormat
  • 当最小 SDK 从 21 增加到 24 时,APK 大小增加了 35mb

    最近 我们将支持的最小 SDK 从 API 21 提高到了 24 显然 这一变化导致我们的 APK 大小从 65mb 增加到 103mb 从Android studio中的APK分析中 我们可以看到所有的 so文件的大小基本上都增加了一倍
  • 替换 Java 中的静态引用方法

    我有一个如下所示的类 其方法仅返回一个字符串 但我想修改它从另一个类返回的内容 而无需自己对其进行硬编码 public class Name public static String getName return MyName 有什么办法可
  • 协议中的公共默认初始化

    我有这个代码 public protocol MyProtocol init public extension MyProtocol public init self init public final class MyClass MyPr
  • 如何处理“intrin.h:没有这样的文件或目录”?

    include
  • 深层路由的 webpack HistoryApiFallback 配置

    webpack dev server 可以设置为将您发送回 index html 并找到单个路由的脚本 例如http localhost 4301 sdr http localhost 4301 sdr但是当您放入更深的路线 或末尾带有 的
  • Mercurial 和 Notepad++ 集成

    Notepad 是否有插件可以与 Mercurial 和 TortoiseHg 集成 如果将以下内容添加到我们的配置文件中 您可以使用 Notepad 打开文件 tortoisehg editor
  • 在用户交互之前,GoogleMap 不会加载详细地图

    我正在 android 上编写一个应用程序 它将显示谷歌地图的地图 当我启动应用程序时 地图以当前位置为中心 当我使用animateCamera 我可以看到整个世界的放大动画 直到它聚焦于当前位置 问题是我需要触摸地图才能使地图以我期望的缩
  • 将 scipy 稀疏矩阵存储为 HDF5

    我想以 HDF5 格式压缩和存储一个巨大的 Scipy 矩阵 我该怎么做呢 我尝试过以下代码 a csr matrix dat row col shape 947969 36039 f h5py File foo h5 w dset f c
  • pyenv install 3.6.3 发生错误:为什么?

    user syyun pyenv install 3 6 3 Downloading Python 3 6 3 tar xz gt https www python org ftp python 3 6 3 Python 3 6 3 tar
  • 应用程序可以在通知中心同时使用警报和横幅吗?

    我正在创建一个 Mac OS X 应用程序来使用通知中心 一些通知应保留在屏幕上 直到用户与它们交互 而其他通知应在显示后不久消失 The NSUserNotificationAlertStyle键和更改系统偏好设置允许在横幅和警报之间进行
  • 无法理解通过引用传递

    我发现理解 C 中的引用传递真的很令人困惑 在我的代码中 我有一个带有两个参数的函数 private bool SerialUnEscape byte serialData ref byte serialResult if SerialPr
  • JAVA数组内不重复的随机数

    我想在一个数组中生成 6 个数字 同时对其进行比较 这样它们就不会相同或没有重复的数字 例如 我想以任意顺序生成 1 2 3 4 5 6 最重要的是不重复 所以我的想法是将生成的数组中的当前数组一一比较 如果数字重复 它将重新运行该方法并再
  • 在 Python 中用多边形计算 Pi

    我在精确计算 Pi 时遇到问题 我使用的方法是 我得到一个半径为 1 的圆 并在其内部放置具有 8 16 32 64 角的多边形 在每个步骤后将它们加倍 但问题是结果只有前15位小数是正确的 这是程序 import math import