首藤です。敬称略します。 #逃避は続くよどこまでも > > 異なる種類の 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