しゅどうです。

正木さん wrote:

> 64 bit Float の構成は
> 符号   1 bit
> 指数部 11 bit
> 仮数部 52 bit
> となっています。

これは IEEE 754 の倍精度数のパラメータです。

一方、Ruby の Float は

  浮動小数点数のクラス。
  Float の実装は C 言語の double で、その精度は環境に依存します。

であって、C 言語の double は IEEE 754 形式とは限らないです。
(と言っても、IEEE 754 ではない環境を見付ける方が
 今となっては大変なのですが..)

なので、まつもとさんがおっしゃるように、

  Ruby 処理系のソースコードに
  IEEE 754 依存のマジックナンバーが入るのはよろしくない

のだと思います。


> したがって指数部は -1024 から 1023 までの値を取るわけですが、

11 bit で e = 0 〜 2047 が表されると考えて、
指数部は 2 ** (e - 1023) となります。
なので、-1024 から 1023、という考え方ではないです。

> (ここから以下は数値実験からの私の推測です)
> 指数部が -1023 の時は Float の range を広げるために、上の規約を使わず
	(略)

ここで正木さんがおっしゃっていることは、多分、
非正規化数 (denormalized number) のことだと思います。

> 指数部 -1024 は Nan,Infinity と言った非数のために残してあると推測
> されます。

e = 0 が、ゼロと非正規化数 (denormalized number) のために、
e = 2047 が NaN と +∞, -∞ のために使われます。

このあたりは、IEEE 754 に書いてあります。
IEEE 754 そのものは、本当は IEEE から買わないといけないのですが、
適当なプロセッサアーキテクチャのマニュアルを見ると、
表現形式については同じことが書いてあります。


Kazuyuki Shudo/首藤一幸   私をたばねないで あらせいとうの花のように
  shudo / computer.org   http://www.shudo.net/