シルバードロップ/エクセル/大儲け | ヨコオタロウの日記


ヨコオタロウの日記


「四十二だと!」ルーンクォールが叫んだ。
「七百五十万年かけて、それだけか?」
「何度も徹底的に検算しました」コンピュータが応じた。
「まちがいなくそれが答えです。率直なところ、みなさんのほうで究極の疑問が何であるかわかっていなかったところに問題があるのです」


銀河ヒッチハイク・ガイド / ダグラス・アダムズ




「シルバーウィークってなんなん?それって美味しいのん?」
「節子!それドロップやない!」


みたいに会社に泊まったりと泊まったり銭湯行ったり。
夜は仕事はかどるからいいっすな。




これはエクセルのバグなのでは?
という事について会社のプログラマーKタヤマさんとこの前議論しました。


まず、現象を説明する前にエクセルでの連番数字の作り方について。


 ・エクセルファイルを新規で作る。
 ・A1に1を入れる。
 ・A1に2を入れる。
 ・上記二つのセルを選択。
 ・選択された右下の■をつまみ、下へドラッグする。


そうすると、1、2、3・・・という連番を作ることが出来ます。
ここまではOK?OKじゃない方は Tips として覚えておくといつかいいことがあるかも。無いかも。


で、上記と同じ方法で以下の連番を作成してみます。


 1.1
 1.2
 1.3
 .
 .
 .


さて、こうやってガーッと下まで引っ張ると普通に小数点の連番が出来てるように見えますな。
パッと見は。


そこで、カーソルを38行目にあわせてみると


 4.8


と表示されていると思います。ところがそれをダブルクリックすると、


 4.79999999999999


となる。ツールバーの入力欄も同じ。
こういう謎の 99999999999 とか 0000000001 とかが連番数字作成時に生成されてしまう。
まあ、こういう現象があると。



プログラムの勘の良い人なら判ると思うんですが、これはコンピューターの小数点計算の誤差から来る現象でよくある状況。
それに気づかず、ずーっと変なデータ生成に悩まされていた僕は、「こんなのバグだよ!Fuck off!」とか言ってたわけです。いや英語は言ってないけど。


そうすると、プログラマのKタヤマさんは「ああこれはしょうがないっすね。仕様仕様」と言うわけです。
でも僕は声を大にして言いたい。これはバグであると。



 ・まず、そんな挙動をユーザーは予想しない。だから仕様のバグである。


 ・100歩譲って、累積した誤差 4.19999999999999999999999999999999999999 の存在を認めよう。
  でも、それを 4.2 と丸めて表示するのは許せない。偽装である。


 ・しかもこれ、0.1, 0.2 という1以下の数字から開始すると誤差が生まれない。
  1.1から始めてる場合と0.1から始めている場合とでは、増加した時の値が違う。
  さらに0.1からはじめると、いつまでも誤差は生まれない。
  いくらなんでもこの違いを意図したとは考えられないので、バグである。



まあ、そうやってエクセルに怒ってもデータは直さなきゃいけないわけで。
そんなシルバーウィーク。




そういえば、こういう誤差を利用して銀行のコンピュータにハッキングして大儲けするって話をどっかで読んだ気がします。
こんな挙動誰も予想しないだろうから、意外と現実にあったりして。