From: shudo@... Date: 2001-04-21T16:55:48+09:00 Subject: [ruby-list:29364] Re: binary IO of integer and FP / Marshal 首藤です。 > |marshaling の際に可読表現に変換せずに、バイナリのまま > |書き出した方がいいんじゃないかと思いますが、いかがでしょう。 > |そうすれば、正負の無限大 (Inf)、NaN にも対応できますし。 少なくとも僕の手もと (Linux + glibc 2.2.1 や SunOS 5.5.1) では、 strtod(3) が inf, -inf, NaN に対応していました。ごめんなさい。 (strtod("nAn", 0) でも NaN が得られました。) まつもとさん wrote: > marshalは精度を維持することよりも可搬性を重視してああなって > るんですが、最近はみんなIEEE形式だと思っても構わないんでしょうか? 首> x86, SPARC, PowerPC, MIPS, Alpha は IEEE 754 準拠です。 です。 浮動小数点数の marshaling にバイナリ表現と可読表現のどちらを用いるか、 どちらにしても損得あると思います。 バイナリ表現だと、確かに、異なるマシン間の可搬性に不安が残るわけです。 10 進数の可読表現でわずかに不安を感じているのは、 仮数部が 2 進数では有限小数だけれど 10 進数だと無限小数になる場合など、 marshal, unmarshal で値が変化してしまうかもしれないことです。 …ならば、符号, 指数部, 仮数部に分けて、2進数で書き出せば、 可搬性を保ちながら上記の不安を取り除けそうです。 しかしそこまでやらなくても、 現在の marshal 処理 sprintf(buf, "%.12g", d) の フォーマットを %.15e にするだけで、 精度の維持という点では、けっこう改善されると思います。 marshaling については昔何度か考える機会がありました。 最初の試みでは XDR を用いたのですが、 のちの試みでは XDR のライブラリを使うのが面倒になったのと 性能を上げたかったのとで、IEEE 754 形式を仮定して、 バイトオーダだけ補整して書き出すようにしました。 Kazuyuki Shudo/首藤一幸 私をたばねないで あらせいとうの花のように shudo@computer.org