原文網址: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處理器的浮點表示法
具體見下圖


