Html5--超越祖冲之

 计算机的快速发展使π的精度越来越高,那么怎么通过计算机计算π值呢?在上一节中,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位是准确的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值