JSON::XSの問題が再現しない環境に関するメモ
http://d.hatena.ne.jp/hiratara/20121024/1351054828
Floating point number decoding in JSON::XS - blog.64p.org
の問題が再現しない環境に関するメモ
環境
i386 Linuxと Windows上の Unix環境(Cygwin等)ではおそらく再現しない
のではないかと思います。利用した JSON::XSはそれぞれ 2.33です。
#!perl use strict; use warnings; use JSON::XS qw(decode_json); my ($dat) = @{decode_json("[0.6]")}; printf("%.20f\n", $dat); printf("%.20f\n", 0.6);
i386 Linuxで再現させる方法
一旦 "perl Makefile.PL"をして Makefileに以下のパッチを当てて
JSON::XSを構築しなおし、インストールします。
diff --git a/Makefile b/Makefile index 4dc15c0..49f77b3 100644 --- a/Makefile +++ b/Makefile @@ -277,7 +277,7 @@ DISTVNAME = JSON-XS-2.33 # --- MakeMaker cflags section: -CCFLAGS = -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 +CCFLAGS = -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -mfpmath=sse -msse2 OPTIMIZE = -O2 PERLTYPE = MPOLLUTE =
これで上記のテストコードを実行すると以下の結果が得られます。
0.60000000000000008882 0.59999999999999997780
期待する結果が得られました。