【问题标题】:how many numbers between 0-1 can a 32bit floating point represent?一个 32 位浮点数可以表示多少个 0-1 之间的数字?
【发布时间】:2021-12-30 11:49:25
【问题描述】:

我想弄清楚 32 位浮点数可以表示多少个 0-1 之间的数字? 和区间一样吗? (2**24)-1

【问题讨论】:

  • 提示:所有具有负指数的正数都将在 0 和 1 之间,无论尾数如何。
  • 什么浮点格式? IEEE 754 binary32 是(绝大多数)最常见的 32 位二进制浮点格式,但它不是唯一的。
  • 大约 25% 的 float.
  • " 是不是和区间一样?(2**24)-1" --> 没有。
  • Niv Peretz,“我想弄清楚有多少……” --> 发布您的尝试。到目前为止,post 没有显示任何尝试。

标签: floating-point precision floating-accuracy floating


【解决方案1】:

这个数字恰好是 1,056,964,609。 (不包括-0)。这仅占正常数字。如果还包括次正规数,则数字为 1,065,353,217。你可以用这样的程序来计算它们:

#include <math.h>
#include <stdio.h>

int main(void) {
   float x = 0.0f;
   int normals = 0;
   int all     = 0;

   while (x <= 1.0) {
     all++;
     if(isnormal(x)) normals++;
     x = nextafterf(x, 1.1);
   }

   printf("normals: %d\n", normals);
   printf("all    : %d\n", all);

   return 0;
}

运行时,会打印:

normals: 1056964609
all    : 1065353217

有趣的是,四分之一的正常浮动都在这个范围内。这通常是相当令人惊讶的,并且可能对统一随机数的生成产生影响。

详情请见https://lemire.me/blog/2017/02/28/how-many-floating-point-numbers-are-in-the-interval-01/

【讨论】:

  • 不包括次正规,对吧? (但包括0.01.0(不包括-0.0)。)
  • @MarkDickinson 非常正确;更新了答案以包括非规范化。
  • 请注意,1,065,353,216 不包括 0 或 1 之一。
  • 低于正常范围的数字的首选术语是“次正常”:这些是低于正常范围的数字,因此它们只能具有非规范化表示。 “非正规”是指不正规的浮点表示。在 IEEE-754 二进制格式中,唯一的非规范化表示是次正规数的表示。在十进制格式中,正常范围内的数字可以有正常或非正常表示。
  • @EricPostpischil 非常正确。修复了命名并添加了一个简单的程序来计算值。
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 2020-01-18
  • 2017-09-04
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多