我的任务是获取浮点数的一部分,然后将其存储在int。中 这似乎很容易。我做了这个测试:
float f = 3.1415f;
printf("int pres. of float: %d\n"
"int: %d", *((int *)&f), 31415);
输出:
int pres. of float: 1078529622
int: 31415
我将它们更改为基数2以查看31415的存在位置。
0100 0000 0100 1001 0000 1110 0101 0110 - 3.1415
0111 1010 1011 0111 - 31415
我不知道该怎么办。我怎么能把分数作为一个简单的整数?
答案 0 :(得分: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
似乎我上面的涂鸦并没有完全关闭......;)
答案 1 :(得分:2)
猜猜你需要从https://en.wikipedia.org/wiki/IEEE_floating_point开始。这将告诉您浮点数的各种表示
答案 2 :(得分:1)
有两个关键的并发症。一个是float是二进制浮点类型,因此它不能完全代表3.1415f。你所拥有的只是近似值。最接近的可精确表示的浮点值是3.141499996185302734375。
另一个是3.1415f在标准化数字的范围内,这意味着有效数字的最高有效位(如果存储)将是非零二进制数字,因此不存储它。