hnwの日記

PHP以外全員不正解

いまだにround関数のまとめは出来ていません。そろそろ皆様に忘れられる前にまとめなきゃな、とは思っていますが、もうしばらくお待ちください。今回は微妙にround関数と近いような遠いような話題です。


巨大な数の丸めについて実験しているうちに、PHPだけ正解でPerlRubyPythonが不正解と思われる例を見つけました。普段の叩かれっぷりを考えるとPHPだけ正解なんて状態は有り得ない気がするのですが、僕には他の結論が導けませんでした。識者の皆様に「ダウト!」と指摘して頂ければ幸いです。


今回は、2の65乗のことを265と表現することにします*1


265=36893488147419103232の次に大きいIEEE64bit浮動小数点数は265+213=36893488147419111424です。仮に、265+212+1=36893488147419107329を浮動小数点数に丸めるとしたら、IEEE754を持ち出すまでもなく表現できる中で最も近い浮動小数点数に丸めるのが自然でしょうから、265+213になるはずです。では実際に試してみましょう。

$ php -r 'printf("%21.0f\n",36893488147419107329);'
 36893488147419111424
$ perl -e 'printf("%21.0f\n",36893488147419107329);'
 36893488147419103232
$ ruby -e 'printf("%21.0f\n",36893488147419107329);'
 36893488147419103232
$ python -c 'print "%21.0f\n" % 36893488147419107329;'
 36893488147419103232


PHPは期待通り265+213に丸めてくれましたが、PHP以外は全員265に丸めました。こんなことってあるんでしょうか。

*1:tex記法と、2^65のような記法と今まで試してきたんですが、どうも不評なので…

続きを読む