我无法理解c中的float变量,所以尝试了一些代码并检查控制台中值的显示方式,
我读了许多关于但没有满足我的文章http://www.cquestions.com/2011/02/memory-representation-of-float-data.html说指数是8位而尾数是24位,但是如果是这样那么指数部分应该在0到256之间变化或者我感到困惑。请帮助我学习这个
void main()
{
float f="different values below";
printf('float value is : %f',f);
}
tried values for f console output
257.123456 257.123444
256.123456 256.123444
128.123456 128.123459
100.123456 100.123459
10.123456 10.123456
答案 0 :(得分:1)
这是对你的一个号码的分析,10.123456。二进制表示,big-endian,是0100_0001_0010_0001_1111_1001_1010_1101
最重要的位是符号位。它为0,表示非负数。
接下来的8位,10000010,十进制130,是指数。它以超过127的形式存储,因此有效指数为130-127 = 3.
对于正常数字,有效数字的形式为1.x,其中x是最后的23位。 1未存储。您的有效数字是1.010_0001_1111_1001_1010_1101。
调整基数2指数为3时,变为1010.0001_1111_1001_1010_1101。二进制点之前的1010对应于小数点前的10。分数部分是129453 /(2 ^ 20)= 0.12345600128173828125。您的浮点数的精确值(十进制)为10.12345600128173828125
答案 1 :(得分:0)
你可以用科学记数法写任何浮点数,例如512.4,得到0.5124 * 10 ^ 3。这里的指数是3,尾数是5124.如果指数有8位,那么你可以表示n *(10 ^ -128 ... 10 ^ 127)。如果n是24位,那么你大概有-2^23 <= n <= 2^23
。实际上计算机使用的是基数2而不是10,但这个想法是一样的。
此外,由于您使用的是base 2并且位数有限,因此您无法以二进制形式表示所有可能的浮点数。这就是输入和输出在某些(大多数)情况下不同的原因。
答案 2 :(得分:0)
要理解的一些关键事项:
指数中的8位偏向127.这是什么意思?这意味着如果值127出现在指数中,则实际上意味着指数在逻辑上为零。类似地,如果出现129,则指数在逻辑上为2,如果出现124,则指数在逻辑上为-3。所以编码或逻辑指数的范围可以从-127到128。
总是假定尾数(并且根据定义)是正的,并且前面有一个隐含的1。因此,如果您在尾数字段中看到10010 ...,则编码的数字为1.10010。
高位是符号位,如果它为零则编码值为正,如果为1则编码值为负。
格式中包含许多特殊值,不适合此模式。例如,零值方便地由每个字段中的所有零比特表示。 NaN(非数字)和无穷大有特殊值。还有非常规的特殊编码,这些是零和最低可表示指数-127之间的值。
例:
你在内存中看到这个值:
00 00 B0 C0
它是一个小端系统,所以它代表这个十六进制值:
0xC0B00000
和这个二进制值:
1100 0000 1011 0000 0000 0000 0000 0000
按符号,指数,尾数字段重新组合数字,数字如下:
1 10000001 01100000000000000000000
所以编码的数字是:
-1.011 * 2 ^ 2
由于指数为正2,我们将小数点向右移动2位。同样,负指数会将小数点向左移动。我们再次重写这个数字:
-101.1
现在让我们将其转换为十进制:
- (1 * 4 + 0 * 2 + 1 * 1 + 1 *(1/2))= -5.5