标准浮点数的 0 和 1 之间有多少个唯一值?
这不是您真正想要回答的问题,但答案是,不包括它们本身0
,在这个范围内1
有2**23 - 1
次正规数和正规126 * 2**23
数,总共127 * 2**23 - 1
, 或1,065,353,215
.
但请注意,这些数字并非0
均匀分布在和之间的区间上1
。在 from to1f / 1065353215f
循环中使用“delta”对您不起作用。0f
1f
如果您想以(十进制)形式 0.00...01 的等长步长从 0.0 步进到 1.0,也许您应该使用decimal
而不是float
. 它将完全代表这样的数字。
如果您坚持使用float
,请尝试使用0.000001
(比您的建议值大十倍),但请注意,当使用不可表示的数字执行非常多的加法时,可能会产生错误。
另请注意:在一些“域”中,您甚至无法计算 a 的前七位有效十进制数字float
。例如,尝试将值保存到0.000986f
变量中(确保优化不会将值保存在“更宽”的存储位置)并写出该变量。前七位数字与resp不同。. 如果您想使用十进制扩展为“短”的数字,您可以再次使用。0.000987f
float
0.0009860000
0.0009870000
decimal
编辑:如果您可以为循环使用“二进制”步骤,请尝试:
float delta = (float)Math.Pow(2, -24);
或等效地作为文字:
const float delta = 5.96046448e-8f;
这个 delta 的好处是,您通过循环遇到的所有值都可以在您的float
. 就在 (under) 之前1f
,您将针对该数量级采取尽可能最短的步骤。