5 c++ floating-point computer-science
浮点数如何由编译器表示和解释.我试图理解这一点,所以我可以很容易地解释字节数组对浮点数和双精度数的意义.
谢谢
Tob*_*ner 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
要实际解释它,您可能不想将其视为字节,因为尾数边界不与 8 位边界对齐。
大致如下:
mantisa = (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp = ((*(unsigned int *)&floatVal) | EXP_MASK ) >> EXP_SHIFT;
sign = ((*(unsigned int *)&floatVal) | SIGN_MASK ) >> SIGN_SHIFT;
Run Code Online (Sandbox Code Playgroud)
可以让你把它拆开来玩果汁中心。
编辑:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
生产:
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 . . .
Run Code Online (Sandbox Code Playgroud)