dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

【Ruby】正確な小数の計算をするなら、FloatではなくBigDecimalを使う

要旨

[1] pry(main)> 1.1-1.0
=> 0.10000000000000009
[2] pry(main)> require 'bigdecimal'
=> true
[3] pry(main)> BigDecimal('1.1') - 1.0
=> 0.1e0

詳細

1.1 - 1.0 の結果は、Float の場合は誤差が出てしまっている。これは2進数で計算するときに生じる誤差である。なぜ誤差が生じるのかは、下記のサイトでビット列を見ると知ることができるが、詳細は割愛する。

tools.m-bsys.com

BigDecimal を使うと、(精度を指定して)正確な小数計算をさせることができる。

なお、BigDecimalFloat 値を渡してはいけない。 必ず String に変換が必要である。これは BigDecimal オブジェクトが作られる前に誤差が発生することを回避するためである。 Integer ならこの問題は起こらない。

[4] pry(main)> BigDecimal(1.0)
ArgumentError: can't omit precision for a Float.
from (pry):4:in `BigDecimal'

参考

docs.ruby-lang.org

github.com

【Ruby】binding.pryで気が済んだので以降のbinding.pryで止まらないようにするには、disable-pry

要旨

disable-pry を入力してEnterを押すと、以降の binding.pry では止まらなくなる。

$ ruby test.rb
1

From: /private/tmp/test.rb:5 :

    1: require 'pry'
    2:
    3: (1..100).to_a.each do |i|
    4:   puts i
 => 5:   binding.pry
    6: end

[1] pry(main)>

2

From: /private/tmp/test.rb:5 :

    1: require 'pry'
    2:
    3: (1..100).to_a.each do |i|
    4:   puts i
 => 5:   binding.pry
    6: end

[1] pry(main)> disable-pry
3
4
5
6
7
...
100

詳細

なお、プログラムをそのまま終了させてしまって良い場合は、 exit! の使用が良さそう。

参考

github.com

【JavaScript】filterでfalsyな値を取り除くには、Array.prototype.filter(Boolean)で良い

要旨

['a', undefined, 1, null].filter(Boolean)
// => ['a', 1]

詳細

filter の構文は、次のようになっている。

let newArray = arr.filter(callback(element[, index, [array]])[, thisArg])

この時、 callbackBoolean を指定すると、 Boolean(element, index, array) が呼ばれることになる。

ここで、 Boolean のコンストラクタに着目する。 Boolean は引数を1つしか取らない。JSは、仮引数で定義された個数を超えて実引数として多く渡した場合、その値は無視される。

よって、各要素は Boolean(element) を評価した結果が callback として呼ばれ、 truthy or falsy が戻り値となる。

参考

developer.mozilla.org

developer.mozilla.org

teratail.com