開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- Learning JavaScript [邦訳](参考書籍)
(1-p)+p*(1-q) を 1-p*q と書き直したら数値計算的に不安定になる事案に遭遇。log_sum_exp(log(1-p), log(p)+log(1-q)) と log(1-p*q) を比べればそれはそう
— しょラー (@shora_kujira16) 2017年4月18日
追記: 他の言語での計算結果を追加。
JavaScript だと計算結果が実際にどうなるか確認したり、任意の数値で確認してみたりできるようにしてみた。
確かに、真(true)のみではなく、偽(false)が登場。
コード(Emacs)
HTML5
p = <input id="p0" type="number" step="0.1" value="2.3"> q = <input id="q0" type="number" step="0.1" value="4.5"> <br> <button id="run0">run</button> <button id="clear0">clear</button> <pre id="output0"></pre> <script src="sample.js"></script>
JavaScript
let input0 = document.querySelector('#p0'), input1 = document.querySelector('#q0'), inputs = [input0, input1], btn0 = document.querySelector('#run0'), btn1 = document.querySelector('#clear0'), pre0 = document.querySelector('#output0'), p = (x) => pre0.textContent += x + '\n'; let f = (p, q) => (1 - p) + p * (1 - q), g = (p, q) => 1 - p * q, range = (n) => { let result = []; for (let i = 0; i < n; i += 1) { result.push(i); } return result; }; let output = () => { pre0.textContent = ''; let p0 = parseFloat(input0.value), q0 = parseFloat(input1.value); p('===, p, q, (1 - p) + p * (1 - q), 1 - p * q'); let a1 = f(p0, q0), a2 = g(p0, q0); p(`${a1 === a2}, ${p0}, ${q0}, ${a1}, ${a2}`); range(10) .map((x) => x / 10) .forEach((i) => { range(10) .map((x) => x / 10) .forEach((j) => { let a1 = f(i, j), a2 = g(i, j); p(`${a1 === a2}, ${i}, ${j}, ${a1}, ${a2}`); }); }); }; btn0.onclick = output; btn1.onclick = () => pre0.textContent = ''; inputs.forEach((input) => input.onchange = output); output();p = q =
===, p, q, (1 - p) + p * (1 - q), 1 - p * q false, 2.3, 4.5, -9.349999999999998, -9.35 true, 0, 0, 1, 1 true, 0, 0.1, 1, 1 true, 0, 0.2, 1, 1 true, 0, 0.3, 1, 1 true, 0, 0.4, 1, 1 true, 0, 0.5, 1, 1 true, 0, 0.6, 1, 1 true, 0, 0.7, 1, 1 true, 0, 0.8, 1, 1 true, 0, 0.9, 1, 1 true, 0.1, 0, 1, 1 true, 0.1, 0.1, 0.99, 0.99 true, 0.1, 0.2, 0.98, 0.98 true, 0.1, 0.3, 0.97, 0.97 true, 0.1, 0.4, 0.96, 0.96 false, 0.1, 0.5, 0.9500000000000001, 0.95 false, 0.1, 0.6, 0.9400000000000001, 0.94 true, 0.1, 0.7, 0.93, 0.93 false, 0.1, 0.8, 0.92, 0.9199999999999999 true, 0.1, 0.9, 0.91, 0.91 true, 0.2, 0, 1, 1 false, 0.2, 0.1, 0.9800000000000001, 0.98 false, 0.2, 0.2, 0.9600000000000001, 0.96 false, 0.2, 0.3, 0.9400000000000001, 0.94 false, 0.2, 0.4, 0.92, 0.9199999999999999 true, 0.2, 0.5, 0.9, 0.9 false, 0.2, 0.6, 0.8800000000000001, 0.88 false, 0.2, 0.7, 0.8600000000000001, 0.86 false, 0.2, 0.8, 0.8400000000000001, 0.84 false, 0.2, 0.9, 0.8200000000000001, 0.82 true, 0.3, 0, 1, 1 true, 0.3, 0.1, 0.97, 0.97 true, 0.3, 0.2, 0.94, 0.94 false, 0.3, 0.3, 0.9099999999999999, 0.91 false, 0.3, 0.4, 0.8799999999999999, 0.88 true, 0.3, 0.5, 0.85, 0.85 false, 0.3, 0.6, 0.82, 0.8200000000000001 false, 0.3, 0.7, 0.7899999999999999, 0.79 false, 0.3, 0.8, 0.7599999999999999, 0.76 true, 0.3, 0.9, 0.73, 0.73 true, 0.4, 0, 1, 1 true, 0.4, 0.1, 0.96, 0.96 false, 0.4, 0.2, 0.92, 0.9199999999999999 false, 0.4, 0.3, 0.8799999999999999, 0.88 true, 0.4, 0.4, 0.84, 0.84 true, 0.4, 0.5, 0.8, 0.8 true, 0.4, 0.6, 0.76, 0.76 true, 0.4, 0.7, 0.72, 0.72 true, 0.4, 0.8, 0.6799999999999999, 0.6799999999999999 false, 0.4, 0.9, 0.64, 0.6399999999999999 true, 0.5, 0, 1, 1 true, 0.5, 0.1, 0.95, 0.95 true, 0.5, 0.2, 0.9, 0.9 true, 0.5, 0.3, 0.85, 0.85 true, 0.5, 0.4, 0.8, 0.8 true, 0.5, 0.5, 0.75, 0.75 true, 0.5, 0.6, 0.7, 0.7 true, 0.5, 0.7, 0.65, 0.65 true, 0.5, 0.8, 0.6, 0.6 true, 0.5, 0.9, 0.55, 0.55 true, 0.6, 0, 1, 1 false, 0.6, 0.1, 0.9400000000000001, 0.94 true, 0.6, 0.2, 0.88, 0.88 true, 0.6, 0.3, 0.8200000000000001, 0.8200000000000001 true, 0.6, 0.4, 0.76, 0.76 true, 0.6, 0.5, 0.7, 0.7 true, 0.6, 0.6, 0.64, 0.64 true, 0.6, 0.7, 0.5800000000000001, 0.5800000000000001 true, 0.6, 0.8, 0.52, 0.52 false, 0.6, 0.9, 0.46, 0.45999999999999996 true, 0.7, 0, 1, 1 true, 0.7, 0.1, 0.93, 0.93 true, 0.7, 0.2, 0.86, 0.86 true, 0.7, 0.3, 0.79, 0.79 true, 0.7, 0.4, 0.72, 0.72 true, 0.7, 0.5, 0.65, 0.65 true, 0.7, 0.6, 0.5800000000000001, 0.5800000000000001 true, 0.7, 0.7, 0.51, 0.51 false, 0.7, 0.8, 0.44, 0.44000000000000006 true, 0.7, 0.9, 0.37, 0.37 true, 0.8, 0, 1, 1 false, 0.8, 0.1, 0.92, 0.9199999999999999 false, 0.8, 0.2, 0.8400000000000001, 0.84 false, 0.8, 0.3, 0.7599999999999999, 0.76 true, 0.8, 0.4, 0.6799999999999999, 0.6799999999999999 true, 0.8, 0.5, 0.6, 0.6 true, 0.8, 0.6, 0.52, 0.52 false, 0.8, 0.7, 0.44, 0.44000000000000006 false, 0.8, 0.8, 0.35999999999999993, 0.3599999999999999 true, 0.8, 0.9, 0.2799999999999999, 0.2799999999999999 true, 0.9, 0, 1, 1 true, 0.9, 0.1, 0.91, 0.91 false, 0.9, 0.2, 0.8200000000000001, 0.82 true, 0.9, 0.3, 0.73, 0.73 false, 0.9, 0.4, 0.64, 0.6399999999999999 true, 0.9, 0.5, 0.55, 0.55 false, 0.9, 0.6, 0.46, 0.45999999999999996 false, 0.9, 0.7, 0.37000000000000005, 0.37 true, 0.9, 0.8, 0.2799999999999999, 0.2799999999999999 true, 0.9, 0.9, 0.18999999999999995, 0.18999999999999995
0 コメント:
コメントを投稿