1. ホーム
  2. random

[解決済み] 0.0と1.0の間にはいくつの倍数があるのでしょうか?

2023-01-23 17:07:05

質問

何年も前から気になっていたことなのですが、これまで質問する時間がありませんでした。

多くの (擬似) 乱数生成器は 0.0 から 1.0 の間の乱数を生成します。数学的にはこの範囲には無限の数が存在しますが double は浮動小数点数であるため、有限の精度を持っています。

ということで質問です。

  1. どれだけの double の間にはいくつの数字があるのでしょうか?
  2. 1 と 2 の間には同じだけ多くの数字がありますか?100と101の間?10^100 と 10^100+1 の間ですか?

注:もしそれが違いを生むなら、私はJavaの定義に興味があります。 double の定義に特に興味があります。

どのように解決するのですか?

Java double IEEE-754 形式であるため、52 ビットの端数を持ちます。隣接する 2 つの 2 の累乗 (1 を含み、次の 1 を除く) の間には、2 の 52 乗が存在することになり、異なる double が存在することになります (つまり、4503599627370496 個)。 例えば、これは異なる double の数であり、1.0 が含まれる場合と 2.0 が含まれる場合の間にもちょうど同じ数が存在します。

を数えることで doubles 0.0 と 1.0 の間を数えるのは、2の累乗の間よりも難しいです。その範囲には多くの2の累乗が含まれ、さらに、非正規化された数という厄介な問題に巻き込まれるからです。 指数部の11ビットのうち10ビットが問題の範囲をカバーしているので、非正規化された数(と、いくつかの種類の NaN を1024倍することになります。 double は 2 の累乗となり、それ以上は 2**62 を超えることはありません。非正規化された &c を除くと、その数は 1023 回になると思います。 2**52 .

100から100.1"のような任意の範囲では、上限を正確に double として正確に表すことができないため、さらに難しくなります (2 の任意の累乗の正確な倍数ではない)。 手軽な近似として、2の累乗の間の進行は線形であるため、当該範囲は 0.1 / 64 であると言えます。

(0.1 / 64) * 2**52

明確 double になる。 7036874417766.4004 ...1つか2つはある;-)。