開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Node.js, Safari(JavaScript エンジン)
- Learning JavaScript [邦訳](参考書籍)
Think Perl 6: How to Think Like a Computer Scientist (Laurent Rosenfeld(著)、Allen B. Downey(著)、Oreilly & Associates Inc)の Part 1(Starting with the basics)、Chapter 6(Iteration)の Exercises 6-1、6-2. を JavaScript で取り組んでみる。
Exercises 6-1、6-2.
コード(Emacs)
HTML5
<pre id="output0"></pre> a = <input id="a0" type="number" min="0" step="1" value="50"> ε = <input id="e0" type="number" min="0" value="0.000000000000001"> <br> <button id="run0">run</button> <button id="clear0">clear</button> <script src="sample1.js"></script>
JavaScript
let btn0 = document.querySelector('#run0'),
btn1 = document.querySelector('#clear0'),
pre0 = document.querySelector('#output0'),
input_a = document.querySelector('#a0'),
input_e = document.querySelector('#e0'),
inputs = [input_a, input_e],
p = (x) => pre0.textContent += x + '\n',
range = (start, end, step=1) => {
let result = [];
for (let i = start; i < end; i += step) {
result.push(i);
}
return result;
};
let sqrt = (a) => {
let x = 1;
for (;;) {
let y = (x + a / x) / 2;
if (y === x) {
break;
}
x = y;
}
return x;
};
let testSquareRoot = () => {
p('a sqrt(a) Math.sqrt(a) diff');
p(
range(1, 11)
.map((a) => {
let x = sqrt(a),
y = Math.sqrt(a);
return `${a} ${x} ${y} ${Math.abs(x - y)}`;
})
.join('\n')
);
};
let factorial = (n) => {
let iter = (i, result) => i === 0 ? result : iter(i - 1, i * result);
return iter(n, 1);
};
let term = (k) =>
factorial(4 * k) * (1103 + 26390 * k) /
(Math.pow(factorial(k), 4) * Math.pow(396, 4 * k));
let estimatePi = (epsilon) => {
let sum = 0;
let k = 0;
for (;;) {
let t = term(k);
sum += t;
if (t < epsilon) {
break;
}
k += 1;
}
return 1 / (2 * Math.sqrt(2) / 9800 * sum);
};
let output = () => {
p('1.');
testSquareRoot();
let a = parseInt(input_a.value, 10),
x = sqrt(a),
y = Math.sqrt(a);
p(`${a} ${x} ${y} ${Math.abs(x - y)}`);
p('2.');
let epsilon = parseFloat(input_e.value);
let pi = estimatePi(epsilon);
p('estimatePi Math.PI diff');
p(`${pi} ${Math.PI} ${Math.abs(pi - Math.PI)}`);
};
inputs.forEach((input) => input.onchange = output);
btn0.onclick = output;
btn1.onclick = () => pre0.textContent = '';
output();
a =
ε =
0 コメント:
コメントを投稿