中国数学家刘徽在注释《九章算术》(263年)时只用圆内接正多边形就求得π的近似值,也得出精确到两位小数的π值,他的方法被后人称为割圆术。他用割圆术一直算到圆内接正192边形。
南北朝时代数学家祖冲之进一步得出精确到小数点后7位的π值(约5世纪下半叶),给出不足近似值3.1415926和过剩近似值3.1415927,还得到两个近似分数值,密率355/113和约率22/7。其中的密率在西方直到1573才由德国人奥托得到,1625年发表于荷兰工程师安托尼斯的著作中,欧洲称之为安托尼斯率。
计算机的快速发展使π的精度越来越高,那么怎么通过计算机器计算π呢?
使用公式: π=C/d
在支持html5的浏览器里运行下面代码。
<!DOCTYPE HTML>
<html>
<body>
<canvas id="myCanvas" width="480" height="300" style="border: 1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>
<script type="text/javascript">
var c = document.getElementById("myCanvas");
var cxt = c.getContext("2d");
var x = 150;
var y = 150;
var r = 100;
var perimeter = 0;
for (var i = x - r; i < x + r + 1; i += 1) {
var tempY = Math.pow(r * r - (x - i) * (x - i), 1 / 2);
cxt.lineTo(i, y + tempY);
var xx = r * r - (x - i + 1) * (x - i + 1);
var tempY2 = Math.pow(r * r - (x - i + 1) * (x - i + 1), 1 / 2);
var temp = getLengthOfTwoPoint({ x: i - 1, y: tempY2 }, { x: i, y: tempY });
if (xx >= 0) {
perimeter += temp;
}
}
alert("π的是值为:" + perimeter / r)
function getLengthOfTwoPoint(startPoint, endPoint) {
var calX = Math.abs(startPoint.x - endPoint.x);
var calY = Math.abs(startPoint.y - endPoint.y);
return Math.pow((calX * calX + calY * calY), 0.5);
}
</script>
</body>
</html>
上面的计算方法是把半圆上的每段相邻两点之间的距离求和,然后除以r得出π的值。
运行之后发现π的是值为:3.1412985671602183 和标准的3.1415926535897932384626433832795028841971693993751058209749 相差甚远!
怎么稍微修改上面代码,提高精确度呢?或者你有更精确的算法?数学家祖冲之得出精确到小数点后7位,你能超过他吗?不管你信不信,反正我信了。