標準浮動小数点数の 0 と 1 の間の一意の値はいくつありますか?
これは実際にはあなたが答えたい質問ではありませんが、答えは、0
と1
自体を含めずに、この範囲に2**23 - 1
非正規数と126 * 2**23
正規数があり、合計で127 * 2**23 - 1
、または1,065,353,215
です。
ただし、これらの数値はとの間の間隔で均等に分布していないことに注意してください。from toループでの「デルタ」を使用してもうまくいきません。0
1
1f / 1065353215f
0f
1f
0.00...01 の (10 進数) 形式の等しい長さのステップで 0.0 から 1.0 にステップしたい場合は、decimal
代わりに を使用する必要がありfloat
ます。そのような数値を正確に表します。
に固執する場合は、 (提案された値の 10 倍)float
を試してください。0.000001
また、注意:float
. たとえば、値0.000986f
または変数0.000987f
に保存してみてくださいfloat
(最適化によって値が「より広い」ストレージの場所に保持されないようにしてください)、その変数を書き出します。最初の 7 桁は0.0009860000
resp と同じではありません。0.0009870000
. ここでもdecimal
、10 進展開が「短い」数値で作業したい場合に使用できます。
編集:ループに「バイナリ」ステップを使用できる場合は、次を試してください。
float delta = (float)Math.Pow(2, -24);
または同等のリテラルとして:
const float delta = 5.96046448e-8f;
このデルタの良いところは、ループを介して遭遇するすべての値が で正確に表現できることfloat
です。の直前 (下)1f
では、そのマグニチュードで可能な限り短いステップを踏むことになります。