IEEE-754中的浮点数可用单精度表示多少个整数?

时间:2017-11-13 17:03:12

标签: floating-point ieee-754

有人可以帮我理解如何计算IEEE-754 with single precision中浮点数表示的整数(整数,而不是小数)?

2 个答案:

答案 0 :(得分:2)

  

IEEE-754中具有单精度的浮点可以表示多少个整数?

有多种方法可以确定这一点。

IEEE-754具有单精度或binary32可以编码所有整数值0到2 24 - 编码具有24位精度(23个显式编码+ 1个隐含)。所以使用底片(而不是-0),

(- 2^24 ... 2^24) is 0x2000000 - 1 different integer values

所有有限FP值2 24 和更高也是整数或"整数"。

来自function to retrieve the number of available distinct values within a range?的是以下不可移植的C代码,它返回每个float的序列号,通常是 binary32

#include <stdint.h>
#include <string.h>
// Return a sequence number for each `float` value.
// Numerically sequential `float` values will have successive (+1) sequence numbers.
uint32_t float_sequence(float x) {
  uint32_t u32;
  memcpy(&u32, &x, sizeof u32);
  if (u32 & 0x80000000) {
    u32 ^= 0x80000000;
    return 0x80000000 - u32;
  }
  return u32 + 0x80000000;
}

使用float_sequence(FLT_MAX) - float_sequence(1 << 24) + 1,我们得到有限float&gt; = 2 24 的数量。

int main(void) {
  int32_t imax = 1L << 24;
  printf("%" PRIx32 "\n", float_sequence(FLT_MAX) - float_sequence((float)imax) + 1);
  printf("%" PRIx32 "\n", (uint32_t) (imax - -imax) - 1);
  printf("%" PRIx32 "\n", float_sequence((float) -imax) - float_sequence(-FLT_MAX) + 1);
  return 0;
}

输出

34000000
1ffffff
34000000

所以总共有0x69FFFFFF或 1,778,384,895 整数值或大约41%的所有二进制32位模式。

如果将-0视为与+0不同,则再多一次。

请注意,最大有限二进制32(带符号)需要128位整数才能将其存储为整数。

如果将整数限制为64位2的补码,则设置计数为0x29FFFFFE或704,643,070。

答案 1 :(得分:2)

我很懒,所以我编写了一个强力搜索,如下所示(假设float映射到IEEE-754 binary32浮点类型):

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

int main (void)
{
    volatile union {
        float f;
        uint32_t i;
    } num;
    uint32_t count = 0;
    num.i = 0;
    do {
        if ((num.f == floorf (num.f)) && !isinf (num.f)) count++;
        num.i++;
    } while (num.i);
    printf ("count = %u\n", count);
    return EXIT_SUCCESS;
}

在速度相当快的PC上,不到一分钟后,程序会吐出:

count = 1778384896

如果要将-0视为+0冗余,则减1。建议使用C编译器提供的最大IEEE-754兼容性编译此代码。我在Windows上使用了英特尔编译器版本13并指定了/fp:strict