2進法の問題(ExcelとRどちらも関係あり)
そんなことも知らなかったのか?と言われそうなことを今更に知りましたので、紹介します。
Excelでデータを整理していて、「AとBの差が0.1未満」を抽出しようとしていたら、差が0.1なのに(つまり0.1未満ではないのに)抽出されてしまった、ということがありました。
試してみましょう。
1つの列のセルに1から0.1ずつ増やしていき、隣の列に0.9から同様に0.1ずつ増やしていきます。隣り合うセルの差は0.1です。if式で「隣り合うセルの差が0.1未満なら(間違いなので)"FALSE"、0.1未満でないのであれば(正しいので)"TRUE"と表示しなさい」と命令してみます。当然、差は0.1であり、0.1未満ではありませんので、全て"TRUE"と表示されるべきです。しかし・・・
ところどころ"FALSE"が出ています。おかしなことに、1.1-1=0.1(正しい)、1.2-1.1<0.1(間違い)、となっているようです。ちょっと面食らいました。
これは、Excelが10進法ではなく2進法を使って計算していることによるものだそうです(参考ページ)。
試しに =1.2-1.1 と入力して、セルの表示形式を「数値」にし、小数点以下の桁数を16桁に指定すると、0.099999999・・・と表示されました。つまり、0.1未満と認識されているわけです。この場合は、例えば =round(1.2-1.1, 1) のように入力すると、正しく0.1として認識されます。1.2-1.1の結果を小数点第2位で四捨五入(小数点以下の桁数を1にする)、という数式です。しかし面倒ですね。
Rではそんなことはないだろうと思いましたが、さにあらず。
Rも同様でした。
こんな風にすれば解決するようです。
1つ目の式は、Excelと同じく、1.2-1.1を小数点第1位まで丸めるように(四捨五入とは少し違うようですが)、2つ目の式は桁数指定をしなければ自動的に小数点以下の6桁で丸めるように、という式です(参考) 。
RでもExcelでも、ある数値を基準にデータを抽出するような場合には、注意が必要です。
お問い合わせ先
〒739-8528 東広島市鏡山1-4-4 広島大学 統合生命科学研究科
082-424-7941 (直通)
tomiyama(at)hiroshima-u.ac.jp