圆周率是如何计算导出的?
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 + "°";
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;
cCenterX
和 cCenterY
是圆的中心点
【讨论】:
以上是关于圆周率是如何计算导出的?的主要内容,如果未能解决你的问题,请参考以下文章