计算机的快速发展使π的精度越来越高,那么怎么通过计算机计算π值呢?在上一节中,N个线段画出一个圆形,所以可以把这些线段的总长度除以圆的直径,得出π的大小。
使用公式: π=C/d
其中,C是圆的周长,d是圆的直径。
在支持HTML5的浏览器里运行下面代码:
<canvas id="myCanvas" width="480" height="300" style="border: 1px solid #c3c3c3;">
你的浏览器不支持canvas
</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 girth = 0;
for (var i = x - r; i < x + r + 1; i++) {
var tempY1 = Math.pow(r * r - (x - i) * (x - i), 1 / 2);
cxt.lineTo(i, y + tempY1);
var tempX = 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: tempY1 });
if (tempX >= 0) {
girth += temp;
}
}
alert("值为:" + girth / 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), 1 / 2);
}
</script>
上面的计算方法是把半个圆上的每段相邻两点之间的距离求和,然后除以r得出π的值,运行之后发现π的值为如上,和标准的3.14159265358979相差甚远。
如何修改上面的代码,提高精确度呢?数学家祖冲之得出了精确到小数点后7位,我们能超过他吗?
因为是用的N条线段模拟圆,只要N越大,就越接近圆。所以可以增大半径r,这样需要的线段越多,求出的π就越接近标准值。将R增大到400000:
<canvas id="myCanvas" width="480" height="300" style="border: 1px solid #c3c3c3;">
你的浏览器不支持canvas
</canvas>
<script type="text/javascript">
var c = document.getElementById("myCanvas");
var cxt = c.getContext("2d");
var x = 150;
var y = 150;
var r = 400000;
var girth = 0;
for (var i = x - r; i < x + r + 1; i++) {
var tempY1 = Math.pow(r * r - (x - i) * (x - i), 1 / 2);
cxt.lineTo(i, y + tempY1);
var tempX = 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: tempY1 });
if (tempX >= 0) {
girth += temp;
}
}
alert("值为:" + girth / 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), 1 / 2);
}
</script>
结果如下所示:
可以看到,我们得到的π值小数点后前8位是准确的。