- 締切済み
浮動小数点の誤差のあわせ方
文字列からdouble型変換で他のPGと誤差がでてしまうのですが、 なんとか同じBinaryにしたいので教えてください。 1.489を他のPGのHEXで表した結果では、 printf("1.489 = %08lx%08lx\n", atof((double)???)); >3ff7d2f1a9fbe76c 私の作ったPGでは printf("1.489 = %08lx%08lx\n", atof("1.489")); >3ff7d2f1a9fbe76d の結果になります。 丸めれば、同じになるような気がしますが、 その方法がわかりません。 SPARC でCのライブラリかなにかあるでしょうか? どうかよろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
基本的には、その程度の差は当然発生するものとして考えて、それでも問題が起きないようなプログラムにするのが普通です。 他のPG..PGってなんでしょうか?プログラムということですか? コンパイラやライブラリが異なれば異なる可能性があり、Cの規約でもそこまでの再現性は求めていないので、バージョンによって異なってしまうなどいろんなことが起きるでしょう。 もっともよく使われる方法は、最終的に利用するときに有効桁数を決めてそこで四捨五入してしまうことです。 そうしないとまず可搬性のない、トラブルメーカーのソフトになると思います。
- kaitou-man
- ベストアンサー率60% (86/141)
元のプログラムが何をしているかわからなくて、具体例も1個しなかい状況では、汎用的な変換方法などを見つけ出すのは不可能だとおもいます。LSBから1を引けばいいのか、LSBを0にすればいいのかさえわかりません。 もっと大量の例が得られるなら、法則性を導くことはある程度は可能かもしれません。しかし、それとて、その例の範囲で適用できるというだけで、適用できない例外が出てこない保証もありません。
- kaitou-man
- ベストアンサー率60% (86/141)
> printf("1.489 = %08lx%08lx\n", atof((double)???)); こちらが何をしているのかわかりませんが、それ次第ですね。 浮動小数点の場合、まるめ誤差が避けられないので、等しいかどうかという条件判断は避けるのが普通です。両者の差と元の値との比率がある程度以下かどうかというので判定するほうがいいでしょう。doubleでは仮数部は53bitあるので比率が1/2^50以下かどうかくらいでしょうか。bit数に依存するのはあまりよくないのですが。
補足
> > printf("1.489 = %08lx%08lx\n", atof((double)???)); > こちらが何をしているのかわかりませんが、それ次第ですね。 そうです。何をしているかわからないので、 "1.489"の文字列を 何とかして 3ff7d2f1a9fbe76c の形にしたいのです。 元のPGでは、特殊なことはしていないはずなので、 比率で判断するのではなく、atof 以外の変換関数 もしくは、ある汎用的な定数計算をかますことで上記の値にしたいです。 あと、コンパイルオプション(-fround )も デフォルトのままでお願いします。