首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不能精确计算Python上的pi

不能精确计算Python上的pi
EN

Stack Overflow用户
提问于 2016-01-17 08:38:24
回答 2查看 644关注 0票数 7

我是这里的新会员,我会直接开车到这里来,因为我整个星期天都在努力想办法解决这个问题。

我是Python的新手,我以前学过C++的编码到基础-中级水平(这是一个为期10周的大学模块)。

我正在尝试一些迭代技术来计算Pi,但两者的结果都有点不准确,我不知道为什么。

我在大学里教过的第一种方法--我相信你们中的一些人以前见过。

代码语言:javascript
运行
AI代码解释
复制
x=0.0
y=0.0
incircle = 0.0
outcircle = 0.0
pi = 0.0
i = 0
while (i<100000):
    x = random.uniform(-1,1)
    y = random.uniform(-1,1)
    if (x*x+y*y<=1):
        incircle=incircle+1
    else:
        outcircle=outcircle+1
    i=i+1
pi = (incircle/outcircle)
print pi

它本质上是平面上随机(x,y)坐标的发生器,从-1到+1,在两个轴上。如果x^2+y^2 <= 1,我们知道点位于由协调轴形成的盒内半径为1的圆内。

根据点的位置,对于incircleoutcircle,计数器会增加。

pi的值是圆内外值的比率。协调是随机产生的,所以应该是均匀的传播。

但是,即使在非常高的迭代值下,我对Pi的结果总是在3.65附近。

第二种方法是另一种迭代方法,它计算多边形的圆周随边数的增加,直到多边形几乎是一个圆,然后,Pi=圆周/直径。(我有点作弊,因为编码中有一个math.cos( Pi )术语,所以看起来我使用Pi来查找Pi,但这只是因为您不能轻易地使用度来表示Python上的角度)。但即使是高迭代,最终结果似乎也会在3.20左右结束,这也是错误的。守则如下:

代码语言:javascript
运行
AI代码解释
复制
S = 0.0
C = 0.0
L = 1.0

n = 2.0
k = 3.0
while (n<2000):
    S = 2.0**k
    L = L/(2.0*math.cos((math.pi)/(4.0*n)))
    C = S*L
    n=n+2.0
    k=k+1.0

pi = C/math.sqrt(2.0)
print pi

我记得,当我做C++课程时,有人告诉我,这个问题是一个常见的问题,它不是因为数学,而是因为编码中的一些东西,但是我记不起来了。这可能与随机数的产生有关,也可能与使用浮点数的限制有关,或者.任何真正的事情。甚至可能只是我的数学..。

有人能想到问题出在哪里吗?

TL;DR:试图计算Pi,我可以接近它,但从来没有非常准确,无论我做了多少次迭代。

(哦,还有另外一点--在第二段代码中,有一行代码表示S=2.0**k,如果我将'n‘设置为高于2000年的值,S的值就会变得太大而无法处理,代码就会崩溃。我怎样才能解决这个问题?)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-17 08:50:36

第一个版本的算法应该更像这样:

代码语言:javascript
运行
AI代码解释
复制
from __future__ import division, print_function

import sys
if sys.version_info.major < 3:
    range = xrange

import random 


incircle = 0
n = 100000
for n in range(n):
    x = random.random()
    y = random.random()
    if (x*x + y*y <= 1):
        incircle += 1
pi = (incircle / n) * 4
print(pi)

指纹:

代码语言:javascript
运行
AI代码解释
复制
3.14699146991

这更近了。增加n,使其更接近pi。

算法只考虑单位圆的四分之一,即半径为1

四分之一圈面积的公式是:

代码语言:javascript
运行
AI代码解释
复制
area_c = (pi * r **2) / 4

对于包含这个圆圈的正方形区域:

代码语言:javascript
运行
AI代码解释
复制
area_s = r **2

其中r是圆的半径。

现在的比率是:

代码语言:javascript
运行
AI代码解释
复制
area_c / area_s

用上面的方程式代替,然后你得到:

代码语言:javascript
运行
AI代码解释
复制
pi = 4 * (area_c / area_s)

去蒙特卡洛,用一个非常高的代表它们的数字代替这两个区域。通常,这里使用的是随机投掷的飞镖的类比。

票数 7
EN

Stack Overflow用户

发布于 2016-01-17 09:24:16

对于第一个问题,您的计算应该是

代码语言:javascript
运行
AI代码解释
复制
pi = incircle/1000000*4  # 3.145376..

这是圆圈内落在总点数之上的点数(在我跑步时大约是0.785671点)。

在半径为1 (random.uniform(-1,1))的情况下,总面积为4,因此,如果以圆圈内着陆点的比例乘以4,则得到正确的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34840741

复制
相关文章
什么?计算机居然不能精确计算0.1+0.2?
小云今年大三在一家互联网公司实习,今天下班回到寝室闷闷不乐,小帅见状关心到:怎么了?碰到什么不开心的事了吗?
zhanyd
2022/05/16
5110
什么?计算机居然不能精确计算0.1+0.2?
python计算时间间隔(精确到微妙)
使用python中的datetime import datetime oldtime=datetime.datetime.now() print oldtime; x=1 while x<10000000: x=x+1 newtime=datetime.datetime.now() print newtime; print u'相差:%s'%(newtime-oldtime) print u'相差:%s微秒'%(newtime-oldtime).microseconds print u'相差:%s秒
py3study
2020/01/07
3.1K0
python计算时间间隔(精确到微妙)
js精确计算
官方文档:http://mikemcl.github.io/big.js/ 使用方法: x = new Big(0.1); y = x.plus(0.2); // '0.3' var a=Big(0.7).plus(x).plus(y); console.log(a.toString()); //a 是一个big对象,通过toString()方法转化成字符串 结果是1.1 博客地址:http://www.cnblogs.com/windseek/
windseek
2018/05/15
3.4K0
spark Pi && word count计算
2.随机向正方形内随机找n个点,计算每一个点到圆心的距离,小于1的就是圆内的点,假设数量是count
用户6404053
2019/11/03
7820
教你精确计算 I2C 上拉电阻阻值
当然,要把预留设备地址去除,7 bit 协议规定了 8个预留地址,普通厂商不可以使用。保留地址如下:
Jasonangel
2021/12/09
10.1K0
教你精确计算 I2C 上拉电阻阻值
Kotlin BigDecimal 精确计算
完整工具类 /** * 加、减、乘、除 高精度计算工具类 * @author lyl 20190191 * */ object UtilsBigDecimal { // 需要精确至小数点后几位 const val DECIMAL_POINT_NUMBER:Int = 2 // 加法运算 @JvmStatic fun add(d1:Double,d2:Double):Double = BigDecimal(d1).add(BigDecimal(d2)).s
码脑
2019/04/11
4.7K0
Java案例-莱布尼兹公式计算Pi的值
依旧是这周 Java 的课后作业了哈哈哈。。。。。。。 作业需求是使用迭代计算PI值
HCG_Sky
2022/03/31
9390
Java案例-莱布尼兹公式计算Pi的值
Raspberry Pi上的OpenVINO,OpenCV和Movidius NCS
在本教程中,将学习如何将OpenVINO工具包与OpenCV一起使用,以便在Raspberry Pi上进行更快速的深度学习推理。
代码医生工作室
2019/06/21
4.3K0
在Raspberry Pi上重温Amiga 【Gaming】
我对复古游戏和让我们有今天的生活的电脑历史的保存十分着迷。我认为大多数程序员都有一台帮助他们培养对编程热爱的机器;对我来说,那就是Commodore Amiga。我现在正在恢复几个Amiga,让他们重新工作。这将需要一些时间,但我想要一些可以迅速运行起来的东西,以便使我可以使用操作系统,并完成一些我从来没有完成过的孩子一样的游戏。
五月Rambo
2019/11/11
1.5K0
在Raspberry Pi上重温Amiga 【Gaming】
如何在 Raspberry Pi 上安装 Ubuntu
Raspberry Pi 一直都是最流行的单板电脑。它可以被用作各种目的,例如:桌面PC,家庭影音中心,智能 WI-FI路由器,自动化操作系统和游戏服务器。用户场景数不胜数。
雪梦科技
2020/05/11
2K0
精确控制模型预测误差(上)
当评估模型的质量时,能够准确测量其预测误差至关重要。然而,测量误差的技术常常会给出严重误导的结果。因为可能导致会过拟合,就是模型可以非常好地拟合训练数据,但是对于在模型训练中未使用的新数据预测结果不太好。这里是准确测量模型预测误差的方法的概述。
哒呵呵
2018/08/06
1.3K0
精确控制模型预测误差(上)
PHP 精度计算问题(精确算法)
这个其实是计算机底层二进制无法精确表示浮点数的一个 bug, 是跨域语言的, 比如 js 中的 舍入误差
很酷的站长
2022/12/28
2K0
PHP 精度计算问题(精确算法)
使用BigDecimal 进行浮点值的精确计算
输出打印为: b1=>7.2882 b2=>7.1 7.22-7.0=0.1882
Dream城堡
2019/01/28
1.6K0
在 centos 上使用 NTP 保持精确的时间
让 Linux 来告诉你时间的时候,它是很奇怪的。你可能认为是使用 time 命令来告诉你时间,其实并不是,因为 time 只是一个测量一个进程运行了多少时间的计时器。为得到时间,你需要运行的是 date 命令,你想查看更多的日期,你可以运行 cal 命令。文件上的时间戳也是一个容易混淆的地方,因为根据你的发行版默认情况不同,它一般有两种不同的显示方法。下面是来自 Ubuntu 16.04 LTS 的示例:
用户1685462
2021/09/13
1.3K0
在 Linux 上使用 NTP 保持精确的时间
如何保持正确的时间,如何使用 NTP 和 systemd 让你的计算机在不滥用时间服务器的前提下保持同步。
用户8989785
2021/09/10
2K0
yum 安装 python36 及 pi
yum install epel-release -y yum -y install sqlite sqlite-devel sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm yum install python36 python36u-pip -y python3.6 -m pip install --upgrade pip mv /usr/bin/python /tmp/ ln -s /usr
py3study
2020/01/08
8690
Java工具类之浮点精确计算
public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 构造器私有,让这个类不能实例化 private Arith() {} // 提供精确的加法运算。 public static double add(double v1,double v2) { BigDecimal b1 = BigDecimal.valueOf(v1);
二十三年蝉
2018/07/03
8630
手把手教你进行 Java 的精确计算
作为 Java 程序员在日常的工作中,很多时候我们都会遇到一些需要进行数据计算的场景,通常对于不需要计算精度的场景我们都可以使用 Integer,Float 或者 Double 来进行计算,虽然会丢失精度但是偶尔也可以用,如果我们需要精确计算结果的时候,就会用到 java.math 包中提供的 BigDecimal 类来实现对应的功能了。
Java极客技术
2022/12/02
5900
手把手教你进行 Java 的精确计算
如何在ART-PI上创建TouchGFX工程
硬件:RT-Thread官方ART-PI H750开发版,正点原子4.3寸RGBLCD屏(800*480) 软件:开发环境 MDK 或 RT-Thread Studio 1.1.5,TouchGFXDesigner v4.15 和 STM32CubeMX V6.0.1,env工具
AIoT-KK
2020/11/09
9350
如何在ART-PI上创建TouchGFX工程
点击加载更多

相似问题

在Python上使用decimal计算Pi

11

JavaScript中PI到x位的精确计算

12

在Rasberry Pi上切换LED的Python精确计时器

13

怎样才能更精确地计算PI?

17

计算python中的pi

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档