Scribble at 2020-11-26 11:11:17 Last modified: 2020-11-26 21:50:31

<?php

$guess = 1.0;

for ( $i = 0; $i < 100; $i++ )

{

$guess = ( ( 2.0 / $guess ) + $guess ) / 2.0;

echo $guess . "<br>\n";

}

SICP の冒頭に出てくる、2の(正の)平方根を近似する procedure(Square Roots by Newton's Method)を PHP で簡単に書くと上記のようになる。$guess = 1.0 から出発すると、4回目の計算で "1.4142135623731" に達して、後は同じ答えが続く。$guess = 5.0 にしても6回目、$guess = 100.0 にしても11回目には "1.4142135623731" に至る。さらに SICP で出てくる "good-enough?" を実装すると、for ループを do-while ループに書き換えて、$guess^2 と 2.0 の差が一定の範囲よりも小さくなったときに break すれば良い。

なお、PHP で普通に計算させると桁数が少ないので、bcadd() や bcmul() を使って50桁くらいにしてもいいのだが、実際にはあまり結果は変わらず、"good-enough?" の判定基準をせいぜい小数点以下14桁くらいにすると、結果の精度は変わらなくなる。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook