0

我的任务是获取浮点数的一部分,然后将其存储在 int 中。 这似乎很容易。我做了这个测试:

float f = 3.1415f;
printf("int pres. of float: %d\n"
       "int:                %d", *((int *)&f), 31415);

输出:

int pres. of float: 1078529622

int: 31415

我将它们更改为 base 2 以查看 31415 的位置。

0100 0000 0100 1001 0000 1110 0101 0110 - 3.1415
                    0111 1010 1011 0111 - 31415

我不知道该怎么办。我怎样才能得到分数作为一个简单的整数?

4

3 回答 3

4

如果我们取 2.5,而不是 3.1415,因为它相当容易理解......

所以你的假设是 2.5 和 25 应该有相同的二进制格式。不是这种情况。25 = 0x19 = 11001。2.5 = 10.1。完全不是一回事。

如果你想对 3.1415 做同样的数学运算,它是这样的:

3      = 11 (I can do that)
1/8    = 0.001  
0.1415 - 0.125 = 0.0165
1/64   = 0.000001
0.0165 - 0.015625 = 0.000875
1/2048 = 0.00000000001

在这一点上,我们还有一些 0.1415 的分数需要处理,但粗略的结果是 11.00100100001。

现在,如果我们比较您的二进制输出(从尾数部分开始),并插入一个小数点,并考虑到浮点数“忽略第一个”:

  11.00100100001
   1.00100100001110

好像我上面的涂鸦并没有完全关闭......;)

于 2013-08-10T09:48:55.170 回答
2

猜猜你需要从https://en.wikipedia.org/wiki/IEEE_floating_point开始。这将告诉你浮点数的各种表示

于 2013-08-10T09:34:15.720 回答
1

有两个关键的并发症。一是float是二进制浮点类型,所以不能准确表示3.1415f。你所拥有的只是一个近似值。最接近的可精确表示的浮点值是 3.141499996185302734375。

另一个是 3.1415f 在归一化数字范围内,这意味着有效数字的最高有效位如果存储,将是非零二进制数字,因此不存储。

于 2013-08-10T09:53:19.950 回答