> > x86 の FPU といえば、FPU 内で浮動小数点数を 64bit で扱う 
> > (FreeBSD)か 80bit で扱う (Linux) かの問題もあります。こ
> > れによって計算結果が変わり得るので。でもこれを言い出すと、
> > 異なる種類の FPU での計算結果は同じになるのか?という問
> > 題にぶつかります。
> > 最悪、プラットフォームが異なると ruby スクリプトの
> > 実行結果が異なる、という現象が起こり得ます。
> > 処理系依存を認めていた過去の言語では問題なかったけれど、
> > Java などでは…
> 
> 言語処理系で問題が発覚するけど、つまるところ
> マシンとOS(と広義のライブラリ)の問題な気もします。
> Java での対応は私も気になります。

IEEE 754 が標準と考えてよいでしょう。

Javaでは、以前の仕様では、常に全ての演算がIEEE 754の64bit形式に従うと
定義されており、x87のように80bit等の拡張形式を内部形式として持つFPUで
は、演算毎に64bitに丸めることが要求されていました。これにより、実行結
果の一意性が保証されていました。

しかし、これでは十分な演算速度が得られない、結果の一意性より演算速度を
優先して良い場合がある等の理由により、最近になって仕様変更があり、クラ
スやメソッドに「widefp」宣言がされているメソッド内では、拡張精度での連
続演算を認め、ただし、インスタンス/クラス変数への格納時には64bitに丸め
る…という仕様になりました。

> 同じ FPU でも丸めモードが異なったりするだけで
> かなりの違いが出ます。
> 特に近い値同士の引き算などは辛いです。

Rubyにおいては、その応用領域から、そこまで結果の一意性を保証する必要は
ないように思えます。近い値同士の引き算のように、精度が低下した値に影響
されるようなコードを書いてはいけない ということでいい と思います。

というか、浮動少数より、任意長少数を使えば良いのでは?

高木 浩光@電子技術総合研究所
http://www.etl.go.jp/~takagi/ (工事中)