我正在尝试各种方法来实现一个顺序给出pi数字的程序.我尝试了泰勒系列方法,但事实证明它非常缓慢地收敛(当我在一段时间后将我的结果与在线值进行比较时).无论如何,我正在尝试更好的算法.
因此,在编写程序时,我遇到了问题,就像所有算法一样:我怎么知道n我计算的数字是准确的?
我正在寻找获得π值的最快方法,作为个人挑战.更具体地说,我使用的方法不涉及使用#define常量M_PI,或者对数字进行硬编码.
下面的程序测试了我所知道的各种方式.从理论上讲,内联汇编版本是最快的选择,但显然不便于携带.我已将其作为基线与其他版本进行比较.在我的测试中,使用内置4 * atan(1)函数,在GCC 4.2上版本最快,因为它会自动将其折叠atan(1)为常量.根据-fno-builtin指定,atan2(0, -1)版本最快.
这是主要的测试程序(pitimes.c):
#include <math.h>
#include <stdio.h>
#include <time.h>
#define ITERS 10000000
#define TESTWITH(x) { \
diff = 0.0; \
time1 = clock(); \
for (i = 0; i < ITERS; ++i) \
diff += (x) - M_PI; \
time2 = clock(); \
printf("%s\t=> %e, time => %f\n", #x, diff, diffclock(time2, time1)); \
}
static inline double
diffclock(clock_t time1, clock_t time0)
{ …Run Code Online (Sandbox Code Playgroud) Python中无穷大的哈希值具有与pi匹配的数字:
>>> inf = float('inf')
>>> hash(inf)
314159
>>> int(math.pi*1e5)
314159
Run Code Online (Sandbox Code Playgroud)
这仅仅是巧合还是故意的?
在使用SciPy的和NumPy的,我应该用一个项目scipy.pi,numpy.pi或math.pi?
定义PI的动机是什么?
PI=4.D0*DATAN(1.D0)
Run Code Online (Sandbox Code Playgroud)
在Fortran 77代码中?我理解它是如何工作的,但是,理由是什么?
我正在做一个接近PI的程序,我试图使用很长时间,但它不起作用.这是代码
#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
num pi;
pi=0;
num e, n;
scanf("%d", &n);
for(e=0; 1;e++){
pi += ((pow((-1.0),e))/(2.0*e+1.0));
if(e%n==0)
printf("%15lld -> %1.16lld\n",e, 4*pi);
//printf("%lld\n",4*pi);
}
}
Run Code Online (Sandbox Code Playgroud) 如何编写一个将pi(π)返回给定小数位数的函数?
速度不是问题.我一直在看http://bellard.org/pi/,但我仍然不明白如何获得pi的第n位数.
所以,不久前我读了一个像这样的笑话:
"永远不要用二进制来计算pi - 因为它无限地进行并且是随机的,它理论上包含每个有限的位串.因此,你将拥有所有受版权保护的材料,并承担一些严重的罚款."
这显然是幽默的,但它让我思考.如果每个有限位串都存在于pi的二进制表示中,是否可以将其用作传输数据的方法?
例如,假设我想传输一个可以解释为jpeg图像的位字符串.我不是直接发送信息,而是在pi的数字内找到它的位置,并简单地发送pi数字中第一位的位置,以及字符串的长度.
这对我来说似乎很简单,但这里显而易见的问题是,即使是前几万亿个数字内找到这个字符串的概率也非常小.因此,最终可能需要花费大量时间才能找到.
我的想法是,几台机器可以专门用于在pi中搜索大文件,然后创建所有起始位置的索引.因此,每次计算只需要发生一次,然后从那时起可以非常快速地传输该信息.
所以你怎么看?这完全可行,还是这些计算需要花费太多时间?
谢谢阅读!如果我忽略了任何发布指南,我会道歉,如果我在这个论坛中提出第一个问题.
编辑:
感谢您的快速回复,伙计们!我认为我的推理有错误,很高兴知道为什么!
我在转换这个公式时遇到了问题V = 4/3 ? r^3.我用Math.PI和Math.pow,但是这是问题的开始位置.我得到这个错误(每次),
';' 预期
此外,直径变量不起作用.那里有错误吗?
import java.util.Scanner;
import javax.swing.JOptionPane;
public class NumericTypes
{
public static void main (String [] args)
{
double radius;
double volume;
double diameter;
diameter = JOptionPane.showInputDialog("enter the diameter of a sphere.");
radius = diameter / 2;
volume = (4 / 3) Math.PI * Math.pow(radius, 3);
JOptionPane.showMessageDialog("The radius for the sphere is "+ radius
+ "and the volume of the sphere is ");
}
}
Run Code Online (Sandbox Code Playgroud) 如何使用C#计算PI的值?
我以为它会通过一个递归函数,如果是这样,它会是什么样子,是否有任何数学公式支持它?
我对性能不太挑剔,主要是从学习的角度来看如何进行.