計算機プログラムの構造と解釈(SICP)学習メモ
蒋 いつ峰 2008/06/30   |  プログラミング基礎
第一章 練習1.7 ニュートン法(Newton's method) 2008/06/30  |  PK:ニュートン法 Newton's method

ニュートン法(Newton’s method)は以下の事実に基づいて平方根を求めます。

1. x の平方根について、推測値 y があります。
2. (y + x/y) / 2 は x のもっと実際値に近い推測値です。

*ニュートン法の詳細について、こちら を参照します。

SICP第一章の練習 1.7 です。
ニュートン法を使って、非常に大きい、または小さい x に対して、x の平方根を求めてください。

D言語による実装です。

 
  1. /** 
  2.   Newton’s method で平方根を求める 
  3.  */  
  4.   
  5. import std.stdio;  
  6. import std.math;  
  7.   
  8. const float GOOD_ENOUGH = 0.0001;  
  9. const int TOO_SLOW = 100;  
  10.   
  11. float sqrt(float value, float guess) {  
  12.     if (value == 0) {  
  13.         return 0;  
  14.     } else if (value < 0) {  
  15.         writefln("Value must be positive.");  
  16.         return -1;  
  17.     }  
  18.     if (guess <= 0) {  
  19.         guess = 1;  
  20.     }  
  21.   
  22.     int round = 0;  
  23.     float next = (guess + value / guess) / 2;  
  24.     while (abs(next - guess) /guess > GOOD_ENOUGH && round < TOO_SLOW) {  
  25.         round++;  
  26.         guess = next;  
  27.         next  = (guess + value / guess) / 2;  
  28.     }  
  29.     return guess;  
  30. }  
  31.   
  32. void main() {  
  33.     float ret = sqrt(2, 1);  
  34.     writefln("square root of %d is %f", 2, ret);  
  35.   
  36.     ret = sqrt(0.000076, 0.008);  
  37.     writefln("square root of %f is %f", 0.000076, ret);  
  38.   
  39.     ret = sqrt(123456, 500);  
  40.     writefln("square root of %d is %f", 123456, ret);  
  41. }  

ソースをコンパイルし、実行した結果です。

uprush@uprush-dev:~/src/d/sicp$ dmd newton.d
uprush@uprush-dev:~/src/d/sicp$ ./newton
square root of 2 is 1.414216
square root of 0.000076 is 0.008718
square root of 123456 is 351.363678

 


閲覧  |  コメント  |  目次

 
ヘルプ  |  ご利用規約  |  相互リンク  |  問合せ
リンクはご自由に、問合せはお気軽に
©2007 Uprush