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/ (工事中)