- - PR -
LinuxでもSUN OSでも同じ結果を得たい
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-09-07 16:22
現在C言語(gcc)で浮動小数演算主体のプログラムしています。
このプログラムはLinux(PC)やSUN OSで動かす必要があるのですが、演算結果に微妙な誤差を生じて困っています。 誤差の原因はわかっていて、IntelプロセッサとUltraSPARCプロセッサに搭載されているコプロセッサの演算精度の違いによるものです。 基本的にSUNの方の精度にあわせたいので、Linux側に仕掛けを入れて何とかならないかと思っています。 四則演算+math.hで定義されている数値ライブラリ関数群が必要です。 演算速度は犠牲にしてもかまわない(10倍以上遅くても良い)のですが、数値演算エミュレータみたいなものはないでしょうか? |
|
投稿日時: 2004-09-07 18:13
ハードウェアに直結されているものは、どうしようもない。
|
|
投稿日時: 2004-09-07 21:20
SPARC は IEEE 754 だ、ということでいいでしょうか?
Linux は 80 bit の拡張倍精度実数を使っていたと思いますが、x86 系の プロセッサは 64 bit とゆーか、仮数部 53 bit のフォーマットを 扱うこともできますから、フォーマットを合わせることは原理的には 可能なはずだと思います。 てゆーか、FreeBSD だと倍精度実数は IEEE 754 だし。 とはいえ、フォーマットが一致することと計算結果が一致するかどうかという ことは別問題ですが。 x86 で IEEE 754 倍精度を扱う方法が 「拡張倍精度から丸める」というものであったとしたら、必ず丸め誤差が 発生しますので... このあたり、実際にはどうなってるのでしょうか? |
|
投稿日時: 2004-09-07 22:08
unibon です。こんにちわ。
昔の DOS 用の C コンパイラーだと、加減乗除レベルの浮動小数点のエミュレーターのライブラリが付属していたものですが、最近は必要性がないので、たぶんそのようなものはないのでしょう。 演算は IEEE に準拠しているはずなので、ビット数が違うとか格納方法が違うなどといった大きな食い違いはないはずなので、なにか細かいところで微妙に違っているだけだとは思いますが、なにが原因で違ってくるのでしょうかね。加減乗除で違うことはまずなさそうだし、sin, log などの数値関数でしょうか。 プログラム中にデバッグ的に変数の値(10進数の文字列に変換せずあくまでも float や double のビットイメージのまま)を吐き出すようなコードを追加して、両方のプラットフォームで動かしてみてバイナリーファイルに落として、比較してみるとどこで違っているかがある程度絞り込めるかもしれません。 もしかしたら、昔の Pentium のように CPU のバグ、ということはもしかしたらあるかも。でもいまどきそんなことは。。。 |
|
投稿日時: 2004-09-07 22:11
この辺はあまり詳しく調べ切れていないのですが、四則演算だけなら
1回演算するごとに変数へ代入することで誤差を最小限に抑えられる ようです。ただし、ぽんす様が言われるように丸め誤差の考慮が必要 となりますね。 べき乗計算などで数値演算ライブラリを使う場合、80bit精度で演算後 に64bitへ丸められるため、上記の方法は取れないようです。 なかなか難しそうです。 LinuxやPCの他のOS上で動くSUNのエミュレータとか無いですかねぇ。 とりあえず現状は諦めます。 ところでJAVAとかの実装はどうなっているんでしょう? 仮想マシンの想定している演算精度はSPARCと一緒だと思うのですが、 WindowsやLinux上の仮想マシンは対応してるのかな? |
1