首藤です。敬称略します。
#逃避は続くよどこまでも

> > 異なる種類の FPU での計算結果は同じになるのか?という問
> > 題にぶつかります。
>
> Java での対応は私も気になります。

高木> IEEE 754 が標準と考えてよいでしょう。
高木> Javaでは、以前の仕様では、常に全ての演算がIEEE 754の64bit形式に従うと
高木> 定義されており
	(略)

確かに IEEE 754,854 では浮動小数点数 (単精度, 倍精度) の
「表現形式」が決められています。ところが…

ある計算を行った結果はこうなるべき、とは
定められていなかったと思います。
(伝聞です。原典にあたったことはないです。)


その実例らしきものを見つけました。
x86 と SPARC で、浮動小数点演算の結果が異なります。

[実験環境]

  x86:
	Pentium with MMX technology / 233MHz
	(Linux 2.2.1)
  SPARC:
	UltraSPARC-II / 296MHz
	(SunOS 5.6)
  丸めモードは round-to-nearest に設定。
  倍精度浮動小数点数 (64bit) の演算。

[実験]

ある数に 1.0 (0x3ff0000000000001) を乗じます。
この乗数、実は 1.0 ちょうどではなく、1.0+ε です。
1.0 より大きい数を乗じるので結果は被乗数より大きくなります、たいていは。
しかし、非常に小さい数に乗じた場合、結果は被乗数と同じに丸めらてしまいます。

被乗数を 1.112809e-308 (0x0008008000000000) とします。
x86  : 演算結果は被乗数と同じ (0x0008008000000000)。
SPARC: 演算結果は被乗数より大きい (0x0008008000000001)。

x86 FPU の内部を double precision (64bit) にしても、
extended precision (80bit) にしても実験結果は同じです。


というわけで、IEEE [78]54 準拠だから安心っ!というわけにはいかないです。
この被互換性は、Java でも発現すると思います。Sun の人は気付いてるだろうか。
気付いていたとしても、いかんともしがたいですね、これ…


SHUDO Kazuyuki/首藤一幸   私をたばねないで あらせいとうの花のように
  shudoh / muraoka.info.waseda.ac.jp