2011-01-28 117 views
0

我知道這可能是一個noob問題,但由於它沒有在我正在學習的電子書中報道,所以我會問這個問題。在IEEE標準二進制浮點格式中,通過科學記數法實際表示數字我知道一個整數值總是假定被添加到二進制的有效部分所示的小數部分,並且不包含在二進制文件中。讓我困惑的是如何區分1和零浮點值,因爲我假設兩者都有一個完全爲零的有效數,我想這裏的區分應該由指數部分完成,但不知道如何!如何區分1和零浮點值?

回答

6

對於零(有兩個,符號位不同的正數和負數零,但必須視爲相等),指數的有效位全部爲0位,而對於非零值至少其中一個具有1位(對於值1,除了最重要的指數外,指數都是1位)。

Wikipedia article on the IEEE 754 standard列出了確切的位模式。

1

我寫了一個答案提(除其他事項外),隱式比特(這是我假設你想知道)這裏https://stackoverflow.com/questions/327020/why-are-floating-point-values-so-prolific/4164252#4164252

我將它進一步擴大在這裏。我將使用字符序列「< =>」和「=>」表示「等同於」和「給予」。

如果你看看IEEE-754單精度浮點32位無符號整數格式(SPFP)號,這是如何提取的各個部分:

  • 登錄:並用爲0x80000000(1位)和右移31位
  • 指數:並用0x7f800000(8 位)和右移23位
  • 有效數字(尾數):並用 0x007fffff(23位)。如果原始的 浮點數非零,你可以在 或隱含的位中使用 0x00800000(=> 24位有效數)。

零有兩種變體:0.0和-0.0(0x00000000和0x80000000)。指數= 0和有效數= 0定義一個零。以同樣的方式,還有兩種變體:1.0和-1.0(0x3f800000和0xbf800000)。正如你所看到的,沒有令人困惑的0.0和1.0。我會盡力解釋原因。

任何非零數字將在0x01到0xfe範圍內有一個指數。有些過分簡化指數0x00(非零有效數字)用於下溢結果案例和指數0xff(對於溢出結果案例(即SPFP異常情況)而言非零有效數字)。對應於1.0的指數是0x7f,它對應於0(見下一段),它給出2^0 = 1。下面的下一個指數是0x7e,對應於-1,它給出2^-1 = 0.5,依此類推。對於指數0x7f,有效位數將嘗試表示範圍爲1.0 < = 2.< = 2.0中的所有數字,也就是說指數定義了要代表的數字的下限,可以上升但不包括下一個更高的數字2的指數。

如果你發現指數很難理解你,並希望它出現「更正常」(作爲基數10人),你可以從它減去0x7f(127),你會得到-126到127的範圍。 128將是溢出指數和-127下溢。

只是所以你不認爲我已經忘記了:如果你設置了符號位,指數0x7f將嘗試表示-1.0> = x> -2.0範圍內的所有數字。

現在到隱含位。隱含位可以稱爲位「22.5」,因爲它位於指數的有效位的最高顯式位和最低顯式位之間。其含義是指數位置1。因此,對於指數0x7f(< => 0 => 2^0),這意味着1.0是表示的實數的組成部分。它右側的第一個顯式位(尾數第22位)表示對應於下一個較小指數(07f-0x01 = 0x7e < => -1 => 2^-1)或0.5的數字是實數等。因此,指數爲0x7f的單精度浮點值的最小分量爲0x7f - 23(有效位中的位)= 0x68(< => -23 => 2^-23)。

爲了把它放在一起:對應於SPFP值0x42b80000的實數是指數0x85-0x7f = 6 =>對於隱式比特64.0:

  • 2^6 * 1(總是隱含位1 )+
  • 2^5 * 0(位有效的22是 復位)+
  • 2^4 * 1(位21被置位)+
  • 2^3 * 1(位20被置位)+
  • 2^2 * 1(位19設置)+
  • (位18至0被複位,因此它們的相應 組分(2^1至 2^-17)未使用)

2^6 + 2^4 + 2^3 + 2^2 => 64 + 16 + 8 + 4 => 92.0,它是由0x42b80000表示的實數。

在這個例子中,你可以看到有效數字是如何被左調整的,它允許SPFP格式的隱含位22.5成爲顯式有效位的位23(雖然總是設置),從而增加了一個額外的精度位到SPFP格式。 DPFP(雙精度)格式類似,但指數範圍較大,有效數字較長。

我建議你在格式上做一些嘗試。我個人的猜測是,99%的程序員從來沒有。