IEEE二进位浮点数算术标准
浮点数是指用符号位(正数为0,复数为1),指数,有效数字位来表示的小数。有单精度(32)和双精度表示(64)。
[图片上传失败...(image-d17584-1530461049799)]
浮点数0.75单精度示例
-
计算符号位
0.75是正数,所以符号位为0. -
计算阶码
- 0.75用二进制表示是0.11,转为科学计数法就是1.1*2-1(Note:必须将浮点数转为1.xxx*2e然后来计算阶码。)
- 上一步将0.75转为二进制的科学计数法1.1*2-1,指数是-1,通过-1来计算阶码,IEEE标准是这样规定的,8位代表阶码为,最大值是11111111=255,这里255的1/2,即01111111=127表示0,那么1.1*2-1的指数-1是用126=01111110来表示,所以阶码=01111110=126
-
计算有效数字
从计算阶码一步0.75用二进制科学计数法1.1*2-1,1.1小数点之后的则是有效数字即1。那么有效数字23位=10000000000000000000000
0.75的单精度浮点表示如下
image我们也可以从上图计算出这个表示的浮点数是什么。
- 符号位为0,那么是正数
- 阶码是01111110=126,因为127其实是代表0,那么126就是代表-1(126-127=-1),也就是指数是-1。(记住阶码的作用是用来表示指数,通过阶码可以求得指数)
- 有效数字是10000000000000000000000
- 那么该浮点数就是
1.(有效数字)*2指数=1.10000000000000000000000*2-1=0.110000000000000000000000(二进制)=0.75(10进制)
浮点数-4.75单精度示例
- -4.75是负数,符号位为1
- 4.75转为二进制=100.11,二进制科学计数法表示=1.0011*22,所以指数是2,因为阶码01111111=127表示0,所以2是用2+127=129来表示=10000001,阶码即是=10000001
- 1.0011*22,所以有效数字是0011.
所以-4.75的浮点数表示是
-4.75的浮点数表示可以通过C程序来测试一下:
#include <stdio.h>
#include<string.h>
int main()
{
float data;
unsigned long buff;
int i;
char s[34];
data=(float)0.75;
memcpy(&buff,&data,4);
//逐一提取出每一位
for(int i=33; i>=0; i--)
{
if(i==1||i==10)
{
s[i]='-';
}
else
{
if(buff%2==1)
{
s[i]='1';
}
else
{
s[i]='0';
}
buff/=2;
}
}
s[34]='\0';
printf("%s\n",s);
}
0.75浮点数表示:
image
-4.75浮点数表示
image
网友评论