先日のPHPの浮動小数点のバグの問題で、PHPを鼻で笑っていたJavaプログラマが顔が赤くる問題が発覚した。つまり、2011年1月31日に、Javaで文字列"2.2250738585072011e-308"を文字列に変換しようとすると、無限ループに陥る事が判明したのだ。
Windows 7上のJava 1.6.0_20(JVMはbuild 16.3-b01, mixed mode)でも確認できたが、10日後にOracleにより修正方法が公開されている。
PHPのバグとは異なる問題のようで、内部的に桁あふれの補正をしている部分で無限ループになっているようだ。数値が条件を満たすまでループをし続けるのだが、ループの奇数回で減産した値と同じ値を、ループの偶数回で加算している。PHPの場合は、浮動小数点のビット長が、レジスタ(x86の80bits)とメモリ(IEEE754の64bits)で異なる事が原因であった。
近年は数値演算でもJavaが利用されるケースが多々あるので、今まで発覚していない事を無視すれば、PHPのときよりも事態は恐らく深刻だ。もっとも浮動小数点関係のバグは、ソフトウェア、ハードウェアを問わず何度か発生している。1994年10月に発覚したPentiumプロセッサが特定ケースの割り算で答えを間違えるPentium FDIV バグは大きく報道され、Intelはリコールに追い込まれた。
0 コメント:
コメントを投稿