Building Abstractions with Functions - The Elements of Programming - Example: Square Roots by Newton's Method - difference, ratio
Structure and Interpretation of Computer Programs: JavaScript Edition(Harold Abelson(著)、Gerald Jay Sussman(著)、Julie Sussman(著)、The MIT Press)のChapter 1(Building Abstractions with Functions)、1.1(The Elements of Programming)、1.1.7(Example: Square Roots by Newton’s Method)、Exercise 1.7の解答を求めてみる。
0.001未満で終了だと、小さい数字の場合は精度が低くなったり、大きい数字の場合は十分な精度でも計算を続けることになったり、あるいは循環して0.001未満にならずに計算が終了しない場合がある。
差じゃなくて比に変更してみる。
コード
let abs = Math.abs;
function square(x) {
return x * x;
}
function improve(guess, x) {
return average(guess, x / guess);
}
function average(x, y) {
return (x + y) / 2;
}
function is_good_enough(previous_guess, guess) {
return abs(1 - guess / previous_guess) < 0.001;
}
function sqrt_iter(previous_guess, guess, x) {
return is_good_enough(previous_guess, guess) ?
guess :
sqrt_iter(guess, improve(guess, x), x);
}
function sqrt(x) {
return sqrt_iter(2 * x, x, x);
}
for (const x of [4, 9, 2, 1e10, 1e-10]) {
console.log(`√${x} ≈ ${sqrt(x)}`);
}
入出力結果(Terminal, Zsh)
% node answer1.7.js
√4 ≈ 2.0000000929222947
√9 ≈ 3.000000001396984
√2 ≈ 1.4142135623746899
√10000000000 ≈ 100000.00015603233
√1e-10 ≈ 0.000010000000015603234
%