如何由编译器表示和解释浮点。我试图理解这一点,所以我可以很容易地解释字节数组对浮点数和双精度数的意义。
由于
答案 0 :(得分:14)
试试此链接:http://en.wikipedia.org/wiki/IEEE_754
我刚发现这可能会有所帮助:http://en.wikipedia.org/wiki/IEEE_754-1985
这是浮点数的IEEE标准。 1985年有一个,2008年有修订版。浮点数为32位,双倍为64位(在第二个链接中说明)。
编辑:这是Don的评论,这里是Intels 80bit浮点描述的链接:http://en.wikipedia.org/wiki/Extended_precision
答案 1 :(得分:3)
值得注意的是,static bool const
成员std::numeric_limits
,is_iec559
,自然只适用于浮点类型。这个名字非常自我解释......
答案 2 :(得分:1)
要实际解释它,您可能不希望将其视为字节,因为mantisa边界不会与8位边界对齐。
有些事情:
mantisa = (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp = ((*(unsigned int *)&floatVal) | EXP_MASK ) >> EXP_SHIFT;
sign = ((*(unsigned int *)&floatVal) | SIGN_MASK ) >> SIGN_SHIFT;
让你把它拆开来玩果汁中心。
编辑:
#include <stdio.h>
void main()
{
float a = 4;
unsigned int exp,sign,mantisa;
int i;
for(i = 0;i<4;i++)
{
exp = (*((unsigned int *)&a) >>23) & 0xFF;
sign = (*((unsigned int *)&a) >>31) & 0x01;
mantisa = (*((unsigned int *)&a)) & 0x7FFFFF | 0x800000;
printf("a = %04x\r\n",*((unsigned int *)&a));
printf("a = %f\r\n",a);
printf("exp = %i, %02x\r\n",exp,exp);
printf("sign = %i, %02x\r\n",sign,sign);
printf("mantisa = %i, %02x\r\n\r\n",mantisa,mantisa);
a = -a / 2;
}
}
产地:
a = 40800000
a = 4.000000
exp = 129, 81
sign = 0, 00
mantisa = 8388608, 800000
a = c0000000
a = -2.000000
exp = 128, 80
sign = 1, 01
mantisa = 8388608, 800000
a = 3f800000
a = 1.000000
exp = 127, 7f
sign = 0, 00
mantisa = 8388608, 800000
a = bf000000
a = -0.500000
exp = 126, 7e
sign = 1, 01
mantisa = 8388608, 800000
Press any key to continue . . .