SHUDO Kazuyuki <shudoh / muraoka.info.waseda.ac.jp> writes: > その実例らしきものを見つけました。 > x86 と SPARC で、浮動小数点演算の結果が異なります。 > ある数に 1.0 (0x3ff0000000000001) を乗じます。 > この乗数、実は 1.0 ちょうどではなく、1.0+ε です。 というか、ようするに 1.0000000000000002 ですよね ?? > 被乗数を 1.112809e-308 (0x0008008000000000) とします。 > x86 : 演算結果は被乗数と同じ (0x0008008000000000)。 > SPARC: 演算結果は被乗数より大きい (0x0008008000000001)。 > x86 FPU の内部を double precision (64bit) にしても、 > extended precision (80bit) にしても実験結果は同じです。 > というわけで、IEEE [78]54 準拠だから安心っ!というわけにはいかないです。 > この被互換性は、Java でも発現すると思います。Sun の人は気付いてるだろうか。 > 気付いていたとしても、いかんともしがたいですね、これ… Javaでも同じ結果になりました。 public class Test { public static void main(String[] args) throws Exception { double a, b, c; a = Double.longBitsToDouble(0x3ff0000000000001L); b = Double.longBitsToDouble(0x0008008000000000L); c = b * a; System.out.println(Long.toString(Double.doubleToLongBits(c), 16)); System.out.println(a); System.out.println(b); System.out.println(c); } } あとはあちらでよろしく。 高木 浩光@電子技術総合研究所 http://www.etl.go.jp/~takagi/ (工事中)