hnwの日記

iPhoneアプリの浮動小数点数が気になる

iPhone買う買う言ってたくせに発売されたら全然買わない人って居ますよね。そう、僕のことです。買う買う詐欺ですね。


そんな、興味があるんだか無いんだかわからないiPhoneですけど、「夏の50連発!! これが定番iPhoneアプリだ(前編)」という記事を見ていたら超気になるスクリーンショットを見つけました。


これは、bytesとKBとMBとGBとTBの値を相互変換してくれるツールらしいんです。入力値を1024倍したり1024で割ったりするだけの簡単なお仕事です。で、1GBを入力されて1024MBとか1048576KBとか表示している図だと思うんですが、なぜか小数点以下に不思議な数字がつきまくりなんです。いったいどういう計算をしたらそんな器用な数を作りだせるんでしょうか。


と言っても、初心者にありがちな浮動小数点数の誤差の蓄積によるバグかな?と思った人も居そうですね。僕も最初はそう思ったんですが、今回はそういう説明ができないんですよ。浮動小数点数の内部表現がIEEE64bit浮動小数点数であれば、n=-1074〜1023の2nを誤差無く表現できるわけです。1GBから計算するのであれば、bytes〜TBの全ての数値を正確に表現できるわけで、どういう順番で計算したって不正確な値を作れないと思うんです。いったいどうやったらこんな不思議な数が出せるんでしょうか。


実は中身がBCDだとか、固定小数点だとか、実はIEEE32bit浮動小数点数を使っているとか、色々考えてみたんですが、どれも有り得ない気がします。iPhone開発者の方には常識的な何かがあるんでしょうか。