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