我正在尝试各种方法来实现一个顺序给出pi数字的程序.我尝试了泰勒系列方法,但事实证明它非常缓慢地收敛(当我在一段时间后将我的结果与在线值进行比较时).无论如何,我正在尝试更好的算法.
因此,在编写程序时,我遇到了问题,就像所有算法一样:我怎么知道n我计算的数字是准确的?
我偶尔碰到这个,总是忘记怎么做.
经常出现的其中一件事.
另外,将以弧度表示的角度转换为度数又返回的公式是什么?
如何使用C#计算PI的值?
我以为它会通过一个递归函数,如果是这样,它会是什么样子,是否有任何数学公式支持它?
我对性能不太挑剔,主要是从学习的角度来看如何进行.
我开始学习CUDA,我认为计算pi的长数字将是一个很好的介绍性项目.
我已经实现了简单的蒙特卡罗方法,该方法很容易并行化.我只是让每个线程在单位正方形上随机生成点,计算单位圆内有多少点,并使用缩小操作计算结果.
但这当然不是计算常数的最快算法.以前,当我在单线程CPU上进行此练习时,我使用类似Machin的公式来进行计算,以便更快地收敛.对于那些感兴趣的人,这涉及将pi表示为反复数组的总和并使用泰勒级数来评估表达式.
这样一个公式的一个例子:

不幸的是,我发现将这种技术并行化到数千个GPU线程并不容易.问题是大多数操作只是在进行高精度数学运算,而不是对长数据向量进行浮点运算.
所以我想知道,在GPU上计算pi的任意长数字的最有效方法是什么?
我正在寻找一个公式/算法来计算给定精度的PI~3.14.
公式/算法必须只有非常基本的算术
因为我想用C++实现这些操作,并希望尽可能简化实现(不允许使用bignum库).
我发现这个计算Pi的公式非常简单:
Pi/4 = 1 - 1/3 + 1/5 - 1/7 + ... = sum( (-1)^(k+1)/(2*k-1) , k=1..inf )
Run Code Online (Sandbox Code Playgroud)
(注意,(-1)^(k + 1)可以由上述运算符容易地实现).
但是这个公式的问题是无法指定要计算的位数.换句话说,没有直接的方法来确定何时停止计算.
也许这个问题的解决方法是计算n-1th和nth计算的术语之间的差异,并将其视为当前错误.
无论如何,我正在寻找具有这些属性的公式/算法,并且还能更快地收敛到Pi
我正在查看http://www0.us.ioccc.org/1988/westley.c上的程序,在另一个SO答案中提到- 它应该打印pi的值,大约3.142,但是当我编译它并运行时我得到它0.250.看起来当GCC预处理器(经过测试的4.1.2和3.4.6)在代码上运行时,它会转换
#define _ -F<00||--F-OO--;
_-_-_
Run Code Online (Sandbox Code Playgroud)
至
-F<00||--F-OO--;- -F<00||--F-OO--;- -F<00||--F-OO--;
Run Code Online (Sandbox Code Playgroud)
但我认为,要使该计划有效,它应该是
-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;
Run Code Online (Sandbox Code Playgroud)
即GCC在"宏观"扩张之前插入一个额外的空间.这#define是应该的方式吗?(自1988年以来有变化吗?)
编辑:此外,任何有关如何防止这些空间出现的信息将不胜感激.
这段代码是如何工作的?
;''
6666,-2%{2+.2/@*\/10.3??2*+}*
`1000<~\;
Run Code Online (Sandbox Code Playgroud)
好像用了数组@*和循环{/**/},但是6666是什么?什么是\/?
我有一个π近似程序,我一直在努力.它使用Rananujen-Chudnovsky系列(/sf/answers/37201/)来近似π.我测试了由我测试的不同来源的2个静态加载的π变体生成的数字.由于某种原因,我计算的经验版本始终无法使数字正确超过29位数.我已经使用了MathContext几乎所有可以使用它的东西.注意:broadcastSystemMessage()本质上是一个System.out.println()但是使格式"很好",基本上把第一个参数看作标题+:而第二个作为正文.
算法实现:
/**
* The much faster Ramanujan-Chudnovsky algorithm.
*/
RAMANUJAN_CHUDNOVSKY {
private final long k1 = 545140134, k2 = 13591409, k3 = 640320,
k4 = 100100025, k5 = 327843840, k6 = 53360;
@Override
public String getAlgorithmName() {
return "Ramanujan-Chudnovsky";
}
@Override
public String getAlgorithmFormula() {
return "S=? from 0 to ?(-1^n *(6n)! * (k2 + n * k1) / ((n!) ^ 3 * (3n)! * 8 * k4 * k5) ^ …Run Code Online (Sandbox Code Playgroud) 问题陈述
需要将N维MeshGrid拆分为“多维数据集”:
例)二维情况:
(-1,1)|(0,1)|(1,1)
(-1,0)|(0,0)|(1,0)
(-1,-1)|(0,-1)|(1,-1)
将有4个单元格,每个单元格具有2 ^ D点:
我希望能够处理网格,将每个单元的坐标点放入容器中以进行进一步处理。
Cells = [{(-1,1) (0,1)(-1,0),(0,0)},
{(0,1),(1,1),(0,0),(1,0)},
{(-1,0),(0,0)(-1,-1),(0,-1)}
{(0,0),(1,0)(0,-1),(1,-1)}]
Run Code Online (Sandbox Code Playgroud)
我使用以下代码为任意尺寸d生成网格:
grid = [np.linspace(-1.0 , 1.0, num = K+1) for i in range(d)]
res_to_unpack = np.meshgrid(*grid,indexing = 'ij')
Run Code Online (Sandbox Code Playgroud)
哪个有输出:
[array([[-1., -1., -1.],
[ 0., 0., 0.],
[ 1., 1., 1.]]), array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])]
Run Code Online (Sandbox Code Playgroud)
因此,我希望能够为给定的D维网格生成上述单元容器。在给定的K上除以2的幂。
我需要这个容器,因此对于每个像元,我需要引用所有关联的2 ^ D点并计算距原点的距离。
编辑说明
K应该将网格划分为K ** D个像元,并具有(K + 1)** D个点。每个像元应具有2 ** D个点。每个“单元”的体积为(2 / K)^ D。
所以对于K = 4,D = 2
Cells = [ …Run Code Online (Sandbox Code Playgroud) math ×5
algorithm ×4
pi ×4
.net ×1
c ×1
c# ×1
constants ×1
cuda ×1
function ×1
gcc ×1
geometry ×1
golfscript ×1
java ×1
macros ×1
numpy ×1
precision ×1
python ×1
simulation ×1
trigonometry ×1
whitespace ×1