hnwの日記

Pythonのround関数の議論を読んでみた

さて、round関数の続きの記事を周囲からも催促されている気がするんですが、まだまとめ切れずにいて僕自身困っていたりします。PHPを擁護するような方向の話をしようかと考えているんですが、なかなか難しくて正直気が重いです*1PHPの中の人の意図も一回はわかったような気がしたんですが、またわからなくなりました。


そんなわけで、横道にそれるわけではありませんが、今回は少し気楽な話題でいきたいと思います。


PHPのroundの件と似た話題を調べていたら、偶然PythonのMLの議論を見つけました。以下のURLとその続きを読んでもらえればわかりますが、質問者は0.0225を小数点以下第3位までに丸めようとして、Python2.3.5だと0.023に、Python2.4.1だと0.022になることに気づきました。

適当に要約すると、「なんでPython2.4で挙動が変わったんだ?」という質問に対して「FAQ。浮動小数について勉強し直して来い」「いや浮動小数一般の話じゃないだろ、コンパイラが違うせいだ」「原因なんてどうでもいい話だ」「特に実装は変わっていない」といった議論があったりして、軽く荒れて終了しています。


さて、今回話題にしたいのは上記の挙動に関してです。まずはこの原因から探ってみましょう。念のためPythonのround関数のソースコードを貼り付けておきます。これはPython/bltinmodule.cに含まれています。下記は2.3.5と2.4.1で共通です。また、僕の手元にバイナリがある2.3.4と2.4系最新版の2.4.4でも同じでした。

*1:今から荒れそうな気がするんだもん

続きを読む