圆周率是如何计算导出的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了圆周率是如何计算导出的?相关的知识,希望对你有一定的参考价值。

计算方法
   圆周率
  1、马青公式   π=16arctan1/5-4arctan1/239   这个公式由英国天文学教授约翰·马青于1706年发现。他利用这个公式计算到了100位的圆周率。马青公式每计算一项可以得到1.4位的十进制精度。因为它的计算过程中被乘数和被除数都不大于长整数,所以可以很容易地在计算机上编程实现。   还有很多类似于马青公式的反正切公式。在所有这些公式中,马青公式似乎是最快的了。虽然如此,如果要计算更多的位数,比如几千万位,马青公式就力不从心了。   2、拉马努金公式   1914年,印度天才数学家拉马努金在他的论文里发表了一系列共14条圆周率的计算公式。这个公式每计算一项可以得到8位的十进制精度。1985年Gosper用这个公式计算到了圆周率的17,500,000位。   1989年,大卫·丘德诺夫斯基和格雷高里·丘德诺夫斯基兄弟将拉马努金公式改良,这个公式被称为丘德诺夫斯基公式,每计算一项可以得到15位的十进制精度。1994年丘德诺夫斯基兄弟利用这个公式计算到了4,044,000,000位。丘德诺夫斯基公式的另一个更方便于计算机编程的形式是:   
3、AGM(Arithmetic-Geometric Mean)算法   高斯-勒让德公式:    圆周率
这个公式每迭代一次将得到双倍的十进制精度,比如要计算100万位,迭代20次就够了。1999年9月,日本的高桥大介和金田康正用这个算法计算到了圆周率的206,158,430,000位,创出新的世界纪录。  
4、波尔文四次迭代式:   这个公式由乔纳森·波尔文和彼得·波尔文于1985年发表的。   5、bailey-borwein-plouffe算法   这个公式简称BBP公式,由David Bailey, Peter Borwein和Simon Plouffe于1995年共同发 丘德诺夫斯基公式
表。它打破了传统的圆周率的算法,可以计算圆周率的任意第n位,而不用计算前面的n-1位。这为圆周率的分布式计算提供了可行性。  
6.丘德诺夫斯基公式   这是由丘德诺夫斯基兄弟发现的,十分适合计算机编程,是目前计算机使用较快的一个公式。以下是这个公式的一个简化版本:  
7.莱布尼茨公式   π/4=1-1/3+1/5-1/7+1/9-1/11+……
希望我的回答对你有帮助,祝你好运!像这样的问题自己多尝试下,下次才会的!

祝你学业进步!
参考技术A 有很多种算法,都比较专业。给你说一个简单的。在电脑上打开计算器,按Pi键就出来了。 参考技术B 第一个用科学方法寻求圆周率数值的人是阿基米德,他在《圆的度量》(公元前3世纪)中用圆内接和外切正多边形的周长确定圆周长的上下界,从正六边形开始,逐次加倍计算到正96边形,得到(3+(10/71))<π<(3+(1/7)) ,开创了圆周率计算的几何方法(亦称古典方法,或阿基米德方法),得出精确到小数点后两位的π值。

中国数学家刘徽在注释《九章算术》(263年)时只用圆内接正多边形就求得π的近似值,也得出精确到两位小数的π值,他的方法被后人称为割圆术。他用割圆术一直算到圆内接正192边形,得出π≈根号10

南北朝时代著名数学家祖冲之进一步得出精确到小数点后7位的π值(约5世纪下半叶),给出不足近似值3.1415926和过剩近似值3.1415927,还得到两个近似分数值,密率355/113和约率22/7。他的辉煌成就比欧洲至少早了1000年。其中的密率在西方直到1573才由德国人奥托得到,1625年发表于荷兰工程师安托尼斯的著作中,欧洲不知道是祖冲之先知道密率的,将密率错误的称之为安托尼斯率。   阿拉伯数学家卡西在15世纪初求得圆周率17位精确小数值,打破祖冲之保持近千年的纪录。   德国数学家柯伦于1596年将π值算到20位小数值,后投入毕生精力,于1610年算到小数后35位数,该数值被用他的名字称为鲁道夫数。

如何计算圆周上的一点?

【中文标题】如何计算圆周上的一点?【英文标题】:How do I calculate a point on a circle’s circumference? 【发布时间】:2009-05-08 13:57:13 【问题描述】:

以下功能如何用各种语言实现?

给定输入值,计算圆周上的(x,y) 点:

半径 角度 来源(可选参数,如果语言支持)

【问题讨论】:

【参考方案1】:

parametric equation for a circle 是

x = cx + r * cos(a)
y = cy + r * sin(a)

其中r是半径,cx,cy是原点,a是角度。

这很容易适应任何具有基本三角函数的语言。 请注意,大多数语言将使用radians 作为三角函数中的角度,因此不是循环通过 0..360 度,而是循环通过 0..2PI 弧度。

【讨论】:

请注意,a 必须以弧度表示——这对我这个初学者来说真的很难理解。 我已经尝试推导这个方程一个小时了。谢谢。谁知道你在高中学到的三角恒等式会很有帮助。 @Dean 由于运算符优先级,不需要额外的括号。当您在这两个等式中有+* 并且没有任何括号时,您总是先选择*,然后再选择+ @IsiomaNnodum 如果我们都回到这里只是为了记住方程式是什么,那就不可能有那么大的帮助了。【参考方案2】:

这是我在 C# 中的实现:

    public static PointF PointOnCircle(float radius, float angleInDegrees, PointF origin)
    
        // Convert from degrees to radians via multiplication by PI/180        
        float x = (float)(radius * Math.Cos(angleInDegrees * Math.PI / 180F)) + origin.X;
        float y = (float)(radius * Math.Sin(angleInDegrees * Math.PI / 180F)) + origin.Y;

        return new PointF(x, y);
    

【讨论】:

预先计算转换系数,这样您使用硬编码数字输入转换错误的机会就会减少。【参考方案3】:

当你有complex numbers时谁需要触发:

#include <complex.h>
#include <math.h>

#define PI      3.14159265358979323846

typedef complex double Point;

Point point_on_circle ( double radius, double angle_in_degrees, Point centre )

    return centre + radius * cexp ( PI * I * ( angle_in_degrees  / 180.0 ) );

【讨论】:

这是如何工作的?它如何比较速度?为什么不更常用? @MarkA.Ropper 复数是如何工作的? - 如果您已经知道复数是什么,请查看数学教程或从en.wikipedia.org/wiki/Euler%27s_identity 前往。与将 sin 实现为查找表相比,它的速度可能没有那么高效,但有时您会使用复数来表示整个点以利用它们的其他属性。与使用四元数进行 3D 旋转类似,这并不是真正的速度,而是它们赋予您的能力。【参考方案4】:

JavaScript (ES6) 中实现:

/**
    * Calculate x and y in circle's circumference
    * @param Object input - The input parameters
    * @param number input.radius - The circle's radius
    * @param number input.angle - The angle in degrees
    * @param number input.cx - The circle's origin x
    * @param number input.cy - The circle's origin y
    * @returns Array[number,number] The calculated x and y
*/
function pointsOnCircle( radius, angle, cx, cy )

    angle = angle * ( Math.PI / 180 ); // Convert from Degrees to Radians
    const x = cx + radius * Math.sin(angle);
    const y = cy + radius * Math.cos(angle);
    return [ x, y ];



用法:

const [ x, y ] = pointsOnCircle( radius: 100, angle: 180, cx: 150, cy: 150 );
console.log( x, y );

Codepen

/**
 * Calculate x and y in circle's circumference
 * @param Object input - The input parameters
 * @param number input.radius - The circle's radius
 * @param number input.angle - The angle in degrees
 * @param number input.cx - The circle's origin x
 * @param number input.cy - The circle's origin y
 * @returns Array[number,number] The calculated x and y
 */
function pointsOnCircle( radius, angle, cx, cy )
  angle = angle * ( Math.PI / 180 ); // Convert from Degrees to Radians
  const x = cx + radius * Math.sin(angle);
  const y = cy + radius * Math.cos(angle);
  return [ x, y ];


const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");

function draw( x, y )

  ctx.clearRect( 0, 0, canvas.width, canvas.height );
  ctx.beginPath();
  ctx.strokeStyle = "orange";
  ctx.arc( 100, 100, 80, 0, 2 * Math.PI);
  ctx.lineWidth = 3;
  ctx.stroke();
  ctx.closePath();

  ctx.beginPath();
  ctx.fillStyle = "indigo";
  ctx.arc( x, y, 6, 0, 2 * Math.PI);
  ctx.fill();
  ctx.closePath();
  


let angle = 0;  // In degrees
setInterval(function()

  const [ x, y ] = pointsOnCircle( radius: 80, angle: angle++, cx: 100, cy: 100 );
  console.log( x, y );
  draw( x, y );
  document.querySelector("#degrees").innerHTML = angle + "&deg;";
  document.querySelector("#points").textContent = x.toFixed() + "," + y.toFixed();

, 100 );
<p>Degrees: <span id="degrees">0</span></p>
<p>Points on Circle (x,y): <span id="points">0,0</span></p>
<canvas   style="border: 1px solid"></canvas>

【讨论】:

【参考方案5】:

在给定距离的圆周上计算点。 为了比较... 这在游戏 AI 中沿直接路径围绕固体对象移动时可能很有用。

public static Point DestinationCoordinatesArc(Int32 startingPointX, Int32 startingPointY,
    Int32 circleOriginX, Int32 circleOriginY, float distanceToMove,
    ClockDirection clockDirection, float radius)

    // Note: distanceToMove and radius parameters are float type to avoid integer division
    // which will discard remainder

    var theta = (distanceToMove / radius) * (clockDirection == ClockDirection.Clockwise ? 1 : -1);
    var destinationX = circleOriginX + (startingPointX - circleOriginX) * Math.Cos(theta) - (startingPointY - circleOriginY) * Math.Sin(theta);
    var destinationY = circleOriginY + (startingPointX - circleOriginX) * Math.Sin(theta) + (startingPointY - circleOriginY) * Math.Cos(theta);

    // Round to avoid integer conversion truncation
    return new Point((Int32)Math.Round(destinationX), (Int32)Math.Round(destinationY));


/// <summary>
/// Possible clock directions.
/// </summary>
public enum ClockDirection

    [Description("Time moving forwards.")]
    Clockwise,
    [Description("Time moving moving backwards.")]
    CounterClockwise


private void ButtonArcDemo_Click(object sender, EventArgs e)

    Brush aBrush = (Brush)Brushes.Black;
    Graphics g = this.CreateGraphics();

    var startingPointX = 125;
    var startingPointY = 75;
    for (var count = 0; count < 62; count++)
    
        var point = DestinationCoordinatesArc(
            startingPointX: startingPointX, startingPointY: startingPointY,
            circleOriginX: 75, circleOriginY: 75,
            distanceToMove: 5,
            clockDirection: ClockDirection.Clockwise, radius: 50);
        g.FillRectangle(aBrush, point.X, point.Y, 1, 1);

        startingPointX = point.X;
        startingPointY = point.Y;

        // Pause to visually observe/confirm clock direction
        System.Threading.Thread.Sleep(35);

        Debug.WriteLine($"DestinationCoordinatesArc(point.X, point.Y");
    

【讨论】:

【参考方案6】:
int x = (int)(radius * Math.Cos(degree * Math.PI / 180F)) + cCenterX;
int y = (int)(radius * Math.Sin(degree * Math.PI / 180F)) + cCenterY;

cCenterXcCenterY 是圆的中心点

【讨论】:

以上是关于圆周率是如何计算导出的?的主要内容,如果未能解决你的问题,请参考以下文章

圆周率是如何计算的

求圆周率的计算公式?

使用 python 实现π的计算

我想知道圆周率是怎么算出来的?没有个准确的数值?

圆周率周长的计算公式?

python如何表示 圆周率