当前位置: 首页 > 知识库问答 >
问题:

标准浮动的0和1之间有多少唯一值?

傅穆冉
2023-03-14

我猜这个问题的另一种表述方式是,你可以用一个只在0到1之间的浮点值来表示小数点后几位?

我试图通过查看MSDN来解决这个问题。精度是7位数。我认为这意味着它只能跟踪0.0000001的变化。

然而,如果我这样做:

float test = 0.00000000000000000000000000000000000000000001f;
Console.WriteLine(test);

它写出9.949219E-44

如果我再加上任何零,它将输出0

我很确定我遗漏了一些东西,因为这种准确度似乎大错特错。主要是因为一个浮点数的大小是32位,在0-1的精度水平下包含1e 44个可能的数字。。。


共有3个答案

祁烨
2023-03-14

我写了一个非常愚蠢的程序,它给出了答案1065353217,这实际上是230(1073741824)。如果要查找不包括0和1的所有数字,请从该数字中减去2。顺便说一下,最小的非零数字似乎是1.401298E-45。

class Program
{
    public unsafe static int Search()
    {
        int i = 0;
        float* f = (float*)&i;
        while (*f >= 0 && *f <= 1)
        {
            f = (float*)&i;
            i++;
        }

        return i;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Search());
        Console.ReadLine();
    }
}
盖昀
2023-03-14

它是7位有效数字,也就是说,当用指数表示法写它时,忽略指数。

0.0000000000001234567的有效位数与1234567000000000的有效位数相同,只是指数不同。这就是允许浮点数存储非常小和非常大的数字的魔力。

至于(0,1)中的浮点数有多少个可能的数字,我现在不能确切地说。你有一个23位的尾数,所以它有223可能的状态。然后有一个8位的指数,如果我没有弄错的话,它一半的可能值将导致0到1之间的数字。这应该会给你留下大约223 7=230这个范围内的可能值。如果有的话,这可能是一个上限,而不是确切的值。我需要向留档人咨询更详细的细节才能确切知道(并且可能会重新思考上面的数学,这可能会遗漏一些要点)。

张唯
2023-03-14
匿名用户

标准浮动的0和1之间有多少唯一值?

这并不是你想要回答的问题,但答案是,不包括01本身,在这个范围内有2**23-1次正常数和126*2**23正常数,总数为127*2**23-1,或1065353215

但是请注意,这些数字并不均匀分布在01之间的间隔上。在从0f1f的循环中使用1f/1065353215f的"delta"将不适合您。

如果你想从0.0步进到1.0步进,同样长的(十进制)步进形式是0.00。。。01,也许你应该使用decimal而不是float。它将准确地代表这样的数字。

如果坚持使用float,请尝试使用0.000001(比建议的值大十倍),但请注意,如果使用不可表示的数字执行大量加法,可能会产生错误。

另请注意:有几个“域”你甚至不能指望浮点数的前七个有效十进制数字。例如,尝试将值0.000986f0.000987f保存到浮点数变量(确保优化不会将值保存在“更宽”的存储位置)并写出该变量。前七个数字与0.0009860000resp.0.0009870000不相同。如果您想使用十进制扩展为“短”的数字,您可以再次使用十进制

编辑:如果您可以为循环使用“二进制”步骤,请尝试:

float delta = (float)Math.Pow(2, -24);

或等同于字面意思:

const float delta = 5.96046448e-8f;

这个增量的好处是,你在循环中包含的所有值都可以在你的<代码>浮点 中精确地表示。就在<代码>1f之前(下),你将为这个数量级采取尽可能短的步骤。

 类似资料:
  • 问题内容: 在Swift中,我试图获得0到1之间的随机浮点数,但是我似乎无法使类型转换正常工作。 我收到“ CGFloat”无法转换为“ UInt8”错误 运行Xcode 6。 问题答案: 尝试将除数也初始化为浮点数la:

  • 我有以下数据帧; 我想将、、列中的浮点值缩放到0到1之间。列中的最高值将缩放为1。请注意,并非所有列都要缩放。 我正在使用Python 3.6。 下面的代码将缩放所有列,但我需要缩放选定的列。另一个问题是有些列是日期和字符串形式。下面的代码将遇到将值转换为浮点值的问题。

  • 问题内容: 和Python和有什么不一样? 我尝试环顾四周,但没有在这些线上找到具体问题。如果已经回答,则链接就足够了。 问题答案: 0和1是退出代码。 意味着干净出口,没有任何错误/问题 表示存在一些问题/错误/问题,这就是程序退出的原因。 这不是特定于Python的,非常普遍。非零退出代码被视为异常退出,有时,错误代码指示问题所在。错误代码为零表示成功退出。 这对于其他程序,shell,调用方

  • 我想有一个随机列表,其中1的出现率为10%,其余项目为零。这个列表的长度是1000。我希望这些值以随机顺序排列,以便它们之间有一个可调整的最小距离。例如,如果我选择一个值3,列表将如下所示: 实现这一点最优雅的方法是什么? 编辑我被要求提供更多的信息并表现出一些努力。 这是一项研究,其中0表示一种刺激,1表示另一种刺激,我们希望刺激类型1之间有一个最小距离。 到目前为止,我通过以下方式实现了这一目

  • 本文向大家介绍“ STL”和“ C ++标准库”之间有什么区别?,包括了“ STL”和“ C ++标准库”之间有什么区别?的使用技巧和注意事项,需要的朋友参考一下 标准模板库(STL)是C ++编程语言的软件库,影响了C ++标准库的许多部分。它提供了四个组件,分别称为算法,容器,函数和迭代器。请注意,术语“ STL”或“标准模板库”在ISO 14882 C ++标准中没有显示。因此,将C ++标

  • 问题内容: 如何使用JavaScript 生成1到100之间的一些 唯一随机 数? 问题答案: 例如:要生成8个唯一的随机数并将其存储到数组中,只需执行以下操作: