電子書籍の厳選無料作品が豊富!

文字列から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のライブラリかなにかあるでしょうか?

どうかよろしくおねがいします。

A 回答 (3件)

基本的には、その程度の差は当然発生するものとして考えて、それでも問題が起きないようなプログラムにするのが普通です。



他のPG..PGってなんでしょうか?プログラムということですか?

コンパイラやライブラリが異なれば異なる可能性があり、Cの規約でもそこまでの再現性は求めていないので、バージョンによって異なってしまうなどいろんなことが起きるでしょう。

もっともよく使われる方法は、最終的に利用するときに有効桁数を決めてそこで四捨五入してしまうことです。
そうしないとまず可搬性のない、トラブルメーカーのソフトになると思います。
    • good
    • 0

元のプログラムが何をしているかわからなくて、具体例も1個しなかい状況では、汎用的な変換方法などを見つけ出すのは不可能だとおもいます。

LSBから1を引けばいいのか、LSBを0にすればいいのかさえわかりません。

もっと大量の例が得られるなら、法則性を導くことはある程度は可能かもしれません。しかし、それとて、その例の範囲で適用できるというだけで、適用できない例外が出てこない保証もありません。
    • good
    • 0

> 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 )も
デフォルトのままでお願いします。

補足日時:2003/02/20 16:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!