2018年3月15日木曜日

学習環境、開発環境

ということで、「===」演算子だとどうなるか確認してみたり。あと、正確に計算できるPython(SymPyモジュール(数式処理システム))や、丸め誤差が発生しない Perl 6を使ったらどうなるか確認してみたり。

JavaScript では、ある一定の精度を越えると切り捨てられるみたい。

コード(Emacs)

HTML5

<pre id="output0"></pre>
<label for="x0">x = </label>
<input id="x0" type="number" value="3.141592653589793">
<button id="run0">run</button>
<button id="clear0">clear</button>

<script src="sample53.js"></script>

JavaScript

let pre0 = document.querySelector('#output0'),
    btn0 = document.querySelector('#run0'),
    btn1 = document.querySelector('#clear0'),
    input_x0 = document.querySelector('#x0'),
    inputs = [input_x0],
    p = (x) => pre0.textContent += x + '\n';

let x1 = 3.1415926535897931111111111;

let output = () => {
    let x0 = parseFloat(input_x0.value);

    p(`Math.PI: ${Math.PI}`);
    p(`x1 = ${x1}`);
    p(`Math.PI == ${x1}: ${Math.PI == x1}`);
    p(`Math.PI === ${x1}: ${Math.PI === x1}`);
    
    p(`x = ${x0}`);
    p(`Math.PI == ${x0}: ${Math.PI == x0}`);
    p(`Math.PI === ${x0}: ${Math.PI === x0}`);
};

inputs.forEach((input) => input.onchange = output);
btn0.onclick = output;
btn1.onclick = () => pre0.textContent = '';
output();








コード(Emacs)

Python 3

#!/usr/bin/env python3
import math
import sympy

my_pi = 3.141592653589793

for t in [math.pi, sympy.pi]:
    sympy.pprint(t)
    print(f'my_pi == {t}: {my_pi == t}')

入出力結果(Terminal, Jupyter(IPython))

$ ./sample53.py
3.141592653589793
my_pi == 3.141592653589793: True
π
my_pi == pi: False
$

SymPy では希望通りの結果に。

Perl 6(6lang)

コード(Emacs)

#!/usr/bin/env perl6

my @nums = (3.141592653589793, 3.1415926535897932);

for @nums -> $num {
    say $num,  ': ' , $num == pi;
}

入出力結果(Terminal)

$ ./sample53.pl
3.141592653589793: True
3.1415926535897932: True
$

JavaScript と同様に、比較演算子「==」による比較の時に、無理数の pi が暗黙的に変換される(?)みたい。

0 コメント:

コメントを投稿