有人可以帮我理解如何计算IEEE-754 with single precision中浮点数表示的整数(整数,而不是小数)?
答案 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
。