[ruby-list:49979] Re: 引き算の結果
From:
Tanaka Akira <akr@...>
Date:
2014-10-02 05:14:42 UTC
List:
ruby-list #49979
2014-10-02 13:35 GMT+09:00 ml-reader <ml-reader@giraku.jp>:
> 下のような結果ってそういうものなのでしょうか。
単純に言ってしまえば、そういうものなのではないでしょうか。
> $ ruby -e 'puts 16.236-15.748'
> 0.4880000000000013
10進数で考えているときに期待される値に対して、浮動小数点で表現可能な値として、
25個ぐらいずれているようですね。
% ./ruby -e 'v = 16.236-15.748; 30.times { p [v, v == 0.488]; v =
v.prev_float }'
[0.4880000000000013, false]
[0.48800000000000127, false]
[0.4880000000000012, false]
[0.48800000000000116, false]
[0.4880000000000011, false]
[0.48800000000000104, false]
[0.488000000000001, false]
[0.48800000000000093, false]
[0.4880000000000009, false]
[0.4880000000000008, false]
[0.48800000000000077, false]
[0.4880000000000007, false]
[0.48800000000000066, false]
[0.4880000000000006, false]
[0.48800000000000054, false]
[0.4880000000000005, false]
[0.48800000000000043, false]
[0.4880000000000004, false]
[0.4880000000000003, false]
[0.48800000000000027, false]
[0.4880000000000002, false]
[0.48800000000000016, false]
[0.4880000000000001, false]
[0.48800000000000004, false]
[0.488, true]
[0.48799999999999993, false]
[0.4879999999999999, false]
[0.4879999999999998, false]
[0.48799999999999977, false]
[0.4879999999999997, false]
> $ ruby -e 'puts 16.111-15.009'
> 1.1020000000000003
こちらはひとつずれているだけのようです。
% ./ruby -e 'v = 16.111-15.009; 10.times { p [v, v == 1.102]; v =
v.prev_float }'
[1.1020000000000003, false]
[1.102, true]
[1.1019999999999999, false]
[1.1019999999999996, false]
[1.1019999999999994, false]
[1.1019999999999992, false]
[1.101999999999999, false]
[1.1019999999999988, false]
[1.1019999999999985, false]
[1.1019999999999983, false]
なお、prev_float (と next_float) は Ruby 2.2 の新機能なので、Ruby 2.1 では使えません。
--
[田中 哲][たなか あきら][Tanaka Akira]