ごとけんです

In message "[ruby-dev:4336] Re: pack("F") for bigendian float"
    on 99/01/25, Yukihiro Matsumoto <matz / netlab.co.jp> writes:

>まつもと ゆきひろです

>|pack/unpack のテンプレート文字に対して以下のような拡張を
>|考えました。
>|
>|  F   bigendian の単精度浮動小数点数(機種依存)
>|  D   bigendian の倍精度浮動小数点数(機種依存)

>  * 機種依存でかつバイトオーダの変換が発生するのは妙な気もし
>    ます.Perlにこのテンプレートがない理由もそれですよね.もっ
>    とも,現状ではほとんどのマシンでfloatのフォーマットは共
>    通になって来てるようですから,問題はないのかも.

御意見どうもです.おっしゃっている通りの理由で問題ないと
判断しました.

厳密に考えると,その処理系が IEEE の浮動小数点数を実装して
いるかどうかでこの拡張を #ifdef して,「(機種依存)」を
はずすのが適当かも知れません.
# どなたか ANSI/IEEE 754-1985 をお持ちの方はいませんか??

あるいはあまり現実的ではないかも知れませんが SunOS 由来の
xdr(3) [RFC1014] を何らかの形で取り込んで,「(機種依存)」を
はずすという手もあります.

それと今回は,float は 32bit で double は 64bit という
ことで決め打ちしているのはやや問題で,ここはなんとか
しないといけないかも知れません.単精度が32bit以外のマシンで 
ruby が動いてればテストができるのですが…

# long が 32bit というのはANSI的に問題ないのでしょうか??

>  * little endianのテンプレートは必要ないのでしょうか.もち
>    ろん,*たまたま*floatのフォーマットが共通の(かつendianが
>    さまざまな)機種間通信と言う観点からはどちらかがあれば良
>    いんでしょうけど.

必要だと思いますが良さげなテンプレート文字が思い付かなくて
実装しませんでした.実際は,小数に関してそのマシンのオーダーと,
lettle/big-endian の3つがそれぞれ単精度/倍精度にあって全部で
6つ必要ですね.2つは f,d があるので新しいのを4つ考えないと
いけないわけですが,空いてる文字をみるに e,E と g,G あたりは
どうかなと思います.つまり,前の D,F は放棄して,

  e  リトルエンディアンの単精度浮動小数点数(機種依存)
  E  リトルエンディアンの倍精度浮動小数点数(機種依存)
  g  ビッグエンディアンの単精度浮動小数点数(機種依存)
  G  ビッグエンディアンの倍精度浮動小数点数(機種依存)

という案です.

とにかく欲しいので,機種依存でかつバイトオーダーを気にする
こともあり得ると納得してもらえるなら,(仮の)実装は僕がします.

いまかかわってる問題(NetCDF)では読み書きの量が多くて
バイトスワップを ruby で書いてると非現実的なんです.
このような拡張で乗り切れると,とっても嬉しい.
# NetCDF <URL:http://www.unidata.ucar.edu/packages/netcdf/>
# Java と Perl はあるらしいのがめちゃめちゃ悔しい…

>  * なんで[4327]のパッチがダメだったのかはわかりませんでした.

ごめんなさい,ダメというのは勘違いかも知れません.

>  * パッチ中の
>
>|+#define ntohf(x) swapl(x)
>
>    は,意味的には
>
>|+#define ntohf(x) swapf(x)
>
>    ですか.挙動は同じですけど.

そ,そうです(^^;;;

-- gotoken