pythonとIronPythonのfloatに対するrepr()の違い
GPS情報をJSONで返すcgiをpython 2.4 + json.py 3.4で作っていると、なんか精度悪い。なんだろうと思って調べてみるとfloat型のjson.write()が小数点以下6桁しか出力していないためだと判明。
まだpythonのfloatはよく分かってないけど、精度は実装に依存する模様。でも、さすがに6桁はないだろうと思ってf = 1.23456789123456789 ; print fとすると11桁まで出力された。
なんでjson.write()は6桁なのかとjson.pyのソースを追ってみると、浮動小数点型を文字列に変換する時に使っている『'%f' % obj』でバッサリ切られるらしい。
D:\Program Files\Python24>python Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> f = 1.12345678901234567890 >>> print f 1.12345678901 >>> print '%f' % f 1.123457 >>> print repr( f ) 1.1234567890123457
色々出力してみると、上記のようになったので、『'%f' % obj』をrepr( obj )に変更すると16桁まで出力できた。うーん、なんで『'%f' % obj』使ってるのかな。
ちなみに、IPCE-r5やIronPythonではrepr()はprintと同じ11桁でした。