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