原文网址:http://www.cnblogs.com/zjujunge/archive/2012/09/13/2682613.html
Intel聘请了最好的数值分析家来为8087FPU设计浮点数格式,他们设计的KCS浮点数标准的工作是如此出色,因此IEEE将这种格式作为IEEE浮点数格式的基础。
为了满足广泛的性能与精度需求,intel实际实现三种浮点格式:单精度、双精度以及扩展精度,本文以前两种讲解。
- 单精度浮点格式
单精度使用24位的尾数与8位的阶码,尾数通常表示的值在(1.0,2.0),尾数的最高为总是假定为1,正好是在二进制二进制小数点左边的第一个位,余下的23个尾数位则在小数点右边,代表该数。具体见下图M为尾数位。
隐含位的存在导致尾数总是大于或等于1,小数点右边的每个位代表一个值(0或1)乘以2一个负幂。尽管从1到2有无限个数,我们能够表示的只有八百万个(223)。
尾数使用1补码格式二不是2的补码。第31位(S)符号决定正负。
阶码使用余-127格式简化了浮点数的比较。
2.双精度浮点
参照单精度浮点解析以及上图即可明白。
3.浮点转成二进制显示部分源代码(C#)
单精度浮点数显示
private void fp_Disp(double number)
{
double zhenshu, xiaoshu, jieguo;
string strZ, strX = "", strJ = "";
Int64 numb = 127;
int i = 1, len, le, len2, len3, Bias = 127;
string s = "", str1, str2, Jiema = "", weishu = "", jia;//,ti_Jiema="";
if (number > 0)
{
s = "0";
}
else
{
s = "1";
}
zhenshu = Math.Floor(Math.Abs(number)); //整数部分
numb = Convert.ToInt64(zhenshu);
strZ = Convert.ToString(numb, 2); xiaoshu = Math.Abs(number) - zhenshu;
for (i = 0; ((xiaoshu != 0) && (i < 23)); i++)
{
jieguo = xiaoshu * 2;
strJ = jieguo.ToString();
strX += strJ.Substring(0, 1);
zhenshu = Math.Floor(jieguo);
xiaoshu = jieguo - zhenshu;
}
strJ = strZ + "." + strX;
str1 = strJ.Substring(0, 1);
if (str1.Equals("1"))
{
len = strZ.Length;
le = len + Bias - 1;
Jiema = Convert.ToString(le, 2);
len2 = Jiema.Length;
if (len2 < 8)
{
for (i = 0, jia = ""; i < 8 - len2; i++)
{
jia += "0";
}
Jiema = jia + Jiema;
}
str2 = strZ.Substring(1, len - 1) + strX;
len = str2.Length;
if (len > 23)
{
weishu = str2.Substring(0, 23);
}
else
{
weishu = str2;
}
}
else
{
len = strX.IndexOf("1");
le = Bias - (len + 1);
Jiema = Convert.ToString(le, 2);
len2 = Jiema.Length;
if (len2 < 8)
{
for (i = 0, jia = ""; i < 8 - len2; i++)
{
jia += "0";
}
Jiema = jia + Jiema;
}
len3 = strX.Length;
if (len3 == (len + 1))
{
weishu = "0";
}
else
{
weishu = strX.Substring(len + 1);
}
}
strJ = s + Jiema + weishu;
len = strJ.Length;
if (len < 32)
{
for (i = 0; i < 32 - len; i++)
{
strJ += "0";
}
} fp_sBox.Text = s;
fp_eBox.Text = Jiema;
len = 23 - weishu.Length;
for (i = 0; i < len; i++)
weishu += "0";
fp_mBox.Text = weishu;
byte fe;
fe = Convert.ToByte(Jiema, 2);
fp_eBox1.Text = fe.ToString();
fp_eBox2.Text = (fe - Bias).ToString();
//ti处理
ti_sBox.Text = s;
ti_eBox2.Text = (fe - Bias).ToString();
ti_eBox1.Text = (fe + 1).ToString();
Jiema = Convert.ToString(fe + 1, 2);
len=Jiema.Length;
for (i = 0; i < 8 - len; i++)
{
Jiema = "0" + Jiema;
}
ti_eBox.Text = Jiema;
ti_mBox.Text = weishu;
dti_eBox.Text = Jiema;
}
4.TI处理器的浮点表示法
具体见下图