JavaRush /Java Blog /Random-TW /計算機記憶體中的實數。解釋。
Marianna
等級 9
Москва

計算機記憶體中的實數。解釋。

在 Random-TW 群組發布
午安 在學習第一個任務的講座「使用實數的細微差別」(第 2 節:浮點數的結構)以及有關該主題的其他講座時,許多人一定遇到了有關該主題的許多問題。最初,我試圖給自己必要的答案,現在我將它們提供給您,以幫助您以一致的邏輯順序充分理解。 1. 十進制和二進制數字系統。 1.1十進制數字系統是最常見的系統之一;它是我們在學校、大學和生活中用於任何非計算機數學計算的系統。它使用數字1、2、3、4、5、6、7、8、9、0(阿拉伯語) - 總共 10 位數字。數字還有羅馬符號,但現在實際上已不使用。在十進制中,計數是以個位、十、百、千、萬、數十萬、百萬等為單位進行計數的。- 換句話說,這些都是數字的數字。 數字的位數是該數字在數字記錄中的位置(位置)。自然數的最低位(也是最低有效位)是個位數(最右邊)。為什麼他是最微不足道的?因為透過刪除數字的個位數,數字本身的變化最小(例如,數字 345 和 340)。接下來,第二位數字是十位數字,依此類推。這是什麼意思呢?讓我們將十進制中的任何整數分解為數字3297 = 3*1000 + 2*100 + 9*10 + 7 因此,我們發現數字3297包含3 個單位的第四位數字(即 3 千)、2 個單位的第三位數字(即 2 百)、9第二位數字的單位(9 個十)和第一位數字的 7 個單位。也就是說,這個數字是三千二百九十七,因此,它是有位置的小數(實數)的數字又如何呢?小數的位數(其小數部分)稱為:十分之幾、 百分之一、千分之幾、萬分之一等。這個數字距離小數點越遠(距離數字的整個部分),其重要性就越低(丟棄它,數字的值變化不大)。例如,我們將任何小數表示為小數: 25.076 = 2*10 + 5 +0*0.1 + 7*0.01 +6*0.001 因此,我們發現小數25.076包含 2 個十、5 個個位、0 個十分之位一,百分之七又千分之六。 十進制系統使用 10 位數字和 10 位的倍數 - 因此稱為“十進制”。 1.2二進制數字系統幾乎是所有現代計算機和其他計算電子設備中使用的數位系統。為了記錄數字,它只使用兩位數字 - 0 和 1。 為了不混淆數字所寫的數字系統,它在右下角提供了一個指示器(它是數字系統的基數),用於範例: 1000₁₀ 10002 這裡第一個數字是十進制中常見的千位,最後一個是二進位表示的數字,在十進制中它是相等的... 8!與十進制系統一樣,二進制系統也將數字分解為數字。二進制數中的每個數字稱為一位(或數字)。(如果有人有興趣的話,4 位元是一個半字節(或四分體),8 位元是一個字節,16 位元是一個字,32 位元是一個雙字)。 位(數字)也從零開始從右到左編號(與十進制系統不同)。最低有效位元、最低有效位元、右位的序號為0。接下來是第一位第二位等等,位越老,它的意義就越大(與我們理解的十進制系統類比 - 如果你從數字 1455 中刪除那些,你將剩下數字 1450 - 幾乎等於初始值。但是如果去掉百位,你將剩下數字1050,這已經離初始值很遠了,因為百位比個位重要得多(高位) )。 例子。 請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 2 在底部,這個小數二進制數的位用紅色編號 - 這個數字總共有 18 位(數字)。展望未來,我想指出,小數以完全不同的方式存儲在計算機內存中- 這將在稍後討論。同時,讓我們學習如何將數字從一種數字系統轉換為另一種數字系統。 2. 將整數和分數從十進位轉換為二進位系統,反之亦然。 2.1 十進位到二進制的轉換。 2.1.1 整數。 為了將整數十進制數轉換為二進制數係統,您需要將該數字除以 2,記下除法的餘數(它始終等於 0 或 1,取決於該數字是偶數還是奇數) ,然後將除法的結果再次除以2 ,再次記下除法的餘數(0 或1),並將第二次除法的結果再次除以2。如此下去,直到除法的結果等於1。接下來,我們從最近的除法結果開始,以 相反的順序寫下所有結果的 0 和 1 ,該結果始終等於 1。重要說明。任何整數連續除以 2 的最終結果總是一 (1)!如果結果大於 1,我們繼續將該結果除以 2,直到得到結果 1。除以 2 的結果僅在一種情況下可以為零 (0) - 這是零本身除以 2。 例。讓我們將數字145從十進制轉換為二進制。 145/2 = 72(餘數1) 72/2 = 36(餘數0) 36/2 = 18(餘數0) 18/2 = 9(餘數0) 9/2 = 4(餘數1) 4/2 = 2 (餘數0 ) 2/2 = 1 (餘數0 ) 現在我們以相反的順序「收集」二進位數。我們得到號碼10010001。完成! 有趣的細微差別 1.讓我們將數字 1從十進位轉換為二進位。在二進制中,這個數字也會寫成1。畢竟除以2的最終結果應該等於1,已經等於數字1本身了。1₁₀ = 12有趣的細微差別2.讓我們轉換一下數字0從十進制轉為二進制。在二進位系統中,該數字也將寫為 0。0₁₀ = 02 2.1.2 小數。 如何將小數轉換為二進位?要將十進制分數轉換為二進位系統,您必須: a)根據第 2.1.1 段中研究的演算法 將分數的整個部分轉換為二進位系統b)將分數的小數部分乘以2 ,寫成結果小數點之前的位數 (總是等於0或1,這是合乎邏輯的),然後只將所得結果的小數部分再次乘以2,在小數點(0或1)之前記下結果的結果數字,依此類推,直到小數部分乘法結果的一部分變成等於0 或直到所需的小數位數(所需的精確度)(等於乘法次數 2)。然後,您需要在分隔實數(小數)數的整數部分和小數部分的 點之後按順序寫下所寫的零和一的結果序列。範例 1. 讓我們將數字2.25(2 點 25 分之一)從十進位轉換為二進位。在二進位系統中,分數將等於10.01。我們是怎麼得到這個的?該數字由整數部分(最多一個點)(即 2)和小數部分(即 0.25)組成。 1) 整個部分的平移: 2/2 = 1(餘數0) 整個部分將為102)小數部分的翻譯。 0.25 * 2 = 0 .5 (0) 0.5 * 2 = 1 .0 (1) 連續乘以 2 後,小數部分變成 0。我們停止相乘。現在我們按順序「收集」小數部分 - 我們在二進位系統中 得到0.01 。3)將整數和小數部分相加 - 我們得到小數部分2.25將等於二進制分數10.01範例 2. 讓我們將數字0.116從十進制轉換為二進位。0.116 * 2 = 0.232 ( 0) 0.232 * 2 = 0.464 (0) 0.464 * 2 = 0.928 (0) 0.928 * 2 = 1.856 ( 1 ) //丟棄該結果的整數部分 0.856 //丟棄該結果的全部部分 0.424 * 2 = 0 .848 (0) 如我們所見,乘法不斷進行,結果的小數部分不等於0。然後我們決定將小數部分轉換為二進制,精度為小數點後7 位(位) 。讓我們記住我們對無關緊要的研究——位(bit)距離整體部分越遠,我們就越容易忽略它(講座第1節中有解釋,誰忘記了)。我們得到二進位小數0.0001110,點後精度為 7 位。 2.2 二進位到十進制的轉換。 2.2.1 整數。 來翻譯一下全文 一個數字從二進制轉為十進制,需要將這個數分成幾位(位),並將每一位(位)乘以數字2到一定的度數(這個度數從最低有效位開始從右向左計數)(右位)並從 0 開始)。換句話說,二的冪等於給定位的數量(但是這個不成文的規則只能在轉換整數的情況下使用,因為對於小數,位元的編號從小數部分開始,這被翻譯為以不同的)。接下來您需要將結果 加起來。例子。 讓我們將二進制數110011轉換為十進制數。 1100112 = 1*2⁵ + 1*2⁴ + 0*23 + 0*22 + 1*21 + 1*2º = 32 +16 +0 + 0 + 2 + 1 = 51₁₀ 結果,我們得到數字 51二進系統。有關信息,以下是數字 2 的一次冪的表格請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 5 請注意,數字的零次方始終為 1。2.2.2 小數。 為了將二進制小數(實數)轉換為十進制,您必須: a)根據第 2.2.1 段中的演算法將其整數部分轉換為十進制; b)將其小數部分翻譯如下。有必要將小數部分錶示為數字乘以 2 的乘積之和,並乘以某個負冪(該點之後的第一個數字的冪(在分數的整個部分之後)將等於 -1,對於小數點後的第二位數字將等於-2 等。)結果該金額將是十進制數字的小數部分。 例子。 讓我們將數字10111.01轉換為二進位系統。 10111.012 = (1*2⁴ + 0*23 + 0*22 + 1*21 + 1*2°) 。(0*2ˉ1 + 1*2ˉ2) = (16 + 0 + 4 + 2 + 1) 。(0 + 0.25) = 23.25₁₀ 因此,我們得到十進位數23.25 。2 的一次負冪表如下。 2.2.3 將數字從二進制轉換為十進制的一般公式。 讓我們給出一個將數字從二進制轉換為十進制(整數部分和小數部分)的通用公式。 其中A是二進制數係統中的數字; 數制的基數是2(意即每一位乘以2的次方); n請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 7 請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 4整數位數(位)m是數字 的小數位數(位數)。 從分界點開始的整數部分的第一位以紅色突出顯示。它始終乘以 2 的零次方。它前面的下一位(左邊)乘以 2 的一次方,依此類推。 分界點小數部分的第一位以綠色突出顯示。它總是乘以 2 的負一次方。右邊的下一位乘以 2 的負二次方,依此類推。 3. 科學記數法:兩個系統中的標準化記數法。尾數、指數、指數的次數。 3.1 數字的指數形式。之前,我們研究了按數字記錄位置編號 的詳細方案。我們以數字0.00000000000000000000016為例。它有一個很長的標準形式條目。在指數形式中,它看起來像這樣: 1.6 * 10ˉ²1 那麼什麼是數字的指數形式以及如何以這種形式表示數字? 數字的科學計數法是將實數表示為尾數指數。方便表示非常大和非常小的數字,以及統一它們的書寫。 N = M * pⁿ 其中N是要寫入的數字, M是數字的 尾數, p是 基數(等於給定數字的數係的基數), n(整數)是(度) ,可以是正數和負數), p 的 n 次方是特徵數(指數,即底數的冪次方(階數))。 一個重要的細微差別。如果小數的整數部分不等於 0,則指數的階次(次數)將為,如果整數部分等於 0,則指數的次數將為3.2 書寫數字的正常和標準化形式。 數字的標準形式是尾數(不考慮符號)位於半區間 [0,1] 上的形式,即 0 <= M < 1。這種書寫形式有缺點:有些數字寫得不明確(例如,0.0001可以寫成0.000001*10²、0.00001⋅101、0.0001⋅10º、0.001⋅10ˉ1等)。因此,另一種記錄形式廣泛存在(尤其是在計算機科學中)——歸一化,其中十進制數的尾數取值從1(含)到10(不含),即1 <= M < 10(同樣,二進制數的尾數取值從1到2)。換句話說,十進制中的尾數必須是從 1.0(含)到 10(不含)的小數,即 尾數的整數部分必須包含單一數字,小數部分不受數學限制。 標準化形式的優點是,任何數字(0 除外)都以唯一的方式寫入。缺點是無法用這種形式表示 0,因此計算機科學中數字的表示為數字 0 提供了一個特殊的符號(位元)。3.3 以指數歸一化形式書寫十進制數的範例 讓我們看一下例子。例 1. 讓我們以指數歸一化形式寫出十進制數1015000(一百萬五千)。此數字的數字系統是十進制,因此基數10。讓我們選擇尾數。為此,請將數字想像為一個分數,其小數部分將等於零(因為該數字是整數):1000000.0。如果數字的整數部分大於0,則將該點向其初始位置(整數部分內)的左側移動,直到整數部分中只剩下一位數字。在它後面我們加了一個句點。我們丟棄無關緊要的零(在數字末尾)。我們得到的數字的尾數等於1.015。讓我們確定該數字的底數的階數(階數) 。分隔整數部分和小數部分的點向左移動了幾個位置?對於六個位置。這意味著訂單將為6。在這種情況下,順序是正的(我們移動了不等於0的數字的整數部分中的點)。標準化形式的最終條目:1.015 * 10⁶。我們可以將這個數字寫成這樣的形式:1.015E6(其中E6是十進制數的指數,即10的6次方)。我們來測試一下自己。數字的指數表示法只不過是一個數字(尾數)和另一個數字(指數)的乘積。如果將 1.015 乘以 10⁶ 會發生什麼事? 1.015*10⁶ = 1.015*1000000 = 1015000。這是正確的。這種方法(標準化)有助於建立明確的記錄 指數形式的數字,如上所述。 例 2. 讓我們以標準化形式寫出十進制實數0.0098。讓我們突出顯示數字的基數- 它等於10(十進制數字系統)。讓我們選擇數字的尾數- 它等於9.8(數字的整數部分等於 0,這意味著我們將點向右移動到第一個有效數字(位於從 1 到 9 的範圍內) . 我們確定數字的順序-我們將點移動了三個位置,這意味著順序是3。正數是負數還是負數?由於我們將點向右移動(在數字的小數部分),因此階(冪)將為負數。歸一化形式的數字的最終記錄是9.8 * 10ˉ39.8E-3。我們再檢查一下自己。將 9.8 乘以 10ˉ3。9.8 * 10ˉ3 = 9.8 * 0.001 = 0.0098。沒錯。 例 3. 讓我們以標準化形式寫好。出十進制實數3.56 。選擇該數字的基數- 它等於10(十進制數字系統)。選擇該數字的尾數- 它等於... 3.56(整數數字的一部分是一位數,不等於0。這意味著該點不需要移動到任何地方,數字本身就是尾數。)讓我們強調基數的順序:尾數應該是多少,等於數字本身,相乘以使其不變?每單位。這意味著訂單將為零。歸一化形式的數字的最終記錄是3.56 * 10°3.56E0。 4. 在電腦記憶體中儲存實數:float 和 double。 4.1 float 和 double 類型。 讓我們進入講座的重點部分。我們已經知道,Java 中有兩種類型的實數:floatdoublefloat類型在電腦記憶體中佔用32位,可以取[3.4E-38;範圍內的值] 3.4E+38)(即3.4*10ˉ³⁸(含)至3.4 * 10³⁸(不含))。 重要的細微差別 1.浮點數可以是正數也可以是負數。上面的範圍用於指示浮點範圍中包含的數字的模數。 重要的細微差別 2. 10^3⁸ 分別約等於 2 ^^27,10ˉ^^^^ 約等於2^^^^7。這樣,浮點數絕對值的區間就可以寫成[3.4 * 2ˉ12⁷; 3.4 * 212⁷)。double 類型佔用兩倍的電腦記憶體 -64位元並且可以接受[-1.7E+308;範圍內的十進制值] 1.7E+308)分別。 4.2 二進制數的指數標準化形式。 我們知道,數字在電腦記憶體中以二進位形式儲存。因此,我們將數字1560.256(浮點型)轉換為位置形式的二進位: 11000011000.01000001100。您可能會認為這就是它儲存在電腦記憶體中的方式。但事實並非如此!在電腦記憶體中, floatdouble 類型(真正的浮點類型)以指數歸一化形式存儲,但冪的底數是 2而不是 10。這是因為,如上所述,所有資料都在電腦以二進位形式(位)表示。一定數量的電腦記憶體被分配給一個數字。讓我們以標準化指數形式表示正數15.21.52*10^。接下來,讓我們使用相同的演算法,以指數歸一化表示法來 表示其二進位「孿生」 1111.00110011001 : 1) 基數將等於 2 2)尾數將等於 1.11100110011001 3) 度數將等於該點向左移動3 位)在十進制中。讓我們將其轉換為二進位系統:11。因此,在二進制指數歸一化形式中,它將是 1.11100110011001 * 2^1。 4.3 在電腦記憶體中儲存浮點數的指數歸一化二進位形式。 因此,我們發現實數將以指數歸一化二進位形式儲存在電腦記憶體中。它在記憶中會是什麼樣子?我們以float類型為例。計算機為每個浮點數分配32 位元它們的分佈如下。此圖示意性地顯示了計算機中為 32 位元浮點數分配的記憶體。 請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 5 位編號以紅色表示。 綠色表示分配的一塊記憶體(1位元),用於儲存數字的符號。 黃色表示分配的一塊內存,用於儲存數字(8 位元)的指數形式的移位冪(階)。 藍色的表示一塊分配的內存,用於儲存沒有隱式單元的數字的歸一化尾數(23 位元)。讓我們仔細看看。 1) 符號位。最高有效位元(左起第一個)始終分配用於儲存數字的符號(如果數字為負則為 1,如果數字為正則為 0)。程式設計的數字零可能是個例外,零可以是負數也可以是正數2)接下來是以2為底的指數的次數(階)位。為此,分配了8位。我們知道,浮點數 的指數次數既可以是負數(對於整數部分為 0 的數字,請參見第 3.3 段),也可以是正數(對於整數部分不為零的數字),範圍從 2ˉ12⁷ 到2127 。理論上,我們應該分配一位來決定指數的符號,就像符號位的情況一樣。但事實並非如此。 為了不浪費一點時間來確定指數的符號,浮點數向指數添加半個位元組+127 (0111 1111) 的偏移量。因此,電腦儲存的不是 2ˉ12⁷ 到 212⁷ 的冪範圍,而是 0 到 +254的冪範圍 ——所有冪值都是正數,不需要在符號上浪費額外的位元組。事實證明,指數的值相對於可能的值移動了一半。這意味著要獲得指數的實際值,必須從記憶體中儲存的值中減去該偏移量。如果儲存在記憶體中的指數值小於偏移量(+127),則指數為負:這是合乎邏輯的。 例子。讓我們執行負度-18 的移位。我們加上偏移量+127,我們得到度數+108的值(在計算中不要忘記度數0)。我們將度數轉換為二進位形式: 1101100 但是為度數分配了 8 位元內存,這裡我們得到一個 7 位數。計算機在空的、未被佔用的高位(位元)處添加 0。 結果是該度數將作為01101100儲存在計算機的記憶體中。讓我們看看:+108 < +127,這意味著度數實際上是負數。考慮下面這個有趣的表: 它顯示了二進制和十進制系統中浮點數標準化形式的冪的所有可能值。正如我們所看到的,在二進位系統中+127恰好是整個位元組(8位元)的一半。 3)剩下的23位保留給尾數 請勿閱讀:))) 電腦記憶體中的實數。 正在開發中!!! - 十一點。但對於歸一化二進制尾數,最高有效位(也稱為歸一化尾數的整數部分)始終等於 1(稱為隱式一),因為尾數的數字位於1<=M<2範圍內(並且還記得講座的第2.1.1 段)。唯一的例外是數字 0。將單元寫入分配的 23 位元並浪費記憶體是沒有意義的,因此尾數的其餘部分(其小數部分)被寫入分配的 23 位元。事實證明,本質上浮點數的有效部分的長度為 24,其中少儲存了一位。 一個重要的細微差別。讓我們記住,當將十進制小數轉換為二進制數時,二進制系統中的小數部分通常會變得很大。而我們只有 32 位元來儲存浮點數。在這種情況下,二進制分數的最低、最低有效數字(請記住本講的第 2.1.2 段)將不會包含在分配的記憶體中,並且計算機將忽略它們數字的準確性將會遺失,但是,你看,這是最小的。換句話說,小數浮點數的精確度小數點後6-7位。 4.4 將雙精度數的指數歸一化二進位形式儲存在電腦記憶體中。double 類型的實數在電腦記憶體中的儲存方式與浮點數相同,但有些特徵除外雙精度數在電腦記憶體中具有 64 位元。它們的分佈如下(也是從左到右的順序): 1)符號位(見4.3段)。我們知道該位的數量將為632) 度(階)。雙精度數被分配11 位元來儲存它。也進行了度數轉換,但對於雙數,它將等於+1023。 3) 尾數(重要部分)。雙精度數分配52 位元(數字)來儲存它。另外,尾數(隱式單位)的精確整數部分不會儲存在記憶體中。另外值得注意的是,小數雙精度數的精確度約為小數點後 16位數。 4.5 在電腦記憶體中表示十進位實數的範例。 我們講座的最後一點將是一個將十進制數字系統的分數轉換為其在計算機內存中存儲的形式的示例,以鞏固對該主題的理解。 例 1. 取一個數字-4.25浮子型。讓我們以二進制數字系統中的指數歸一化形式呈現它,記住我們在本講座中介紹的所有內容。 1)將數字的整數部分轉換為二進位形式: 4/2 = 2(除0的餘數) 2/2 = 1 (除0的餘數) 整數部分在二進位中將 等於100 。2)將數字的小數部分轉換為二進位形式。0.25*2 = 0.5 ( 0 ) 0.5*2 = 1.0 ( 1 ) 小數部分在二進位中將 等於0.01 。3)因此,-4.25₁0 = -100.0124)讓我們將數字 -100.012 轉換為二進制數係中的指數歸一化形式(這意味著冪的底數為 2)。-100.01² = -1.0001 *2² 讓我們將度數值從十進位格式轉換二進位格式。2/2= 1(餘數0) 次數為10 2 。 我們得到二進位指數歸一化形式的數字 -4.25₁₀ 將等於-1.0001 * 21° 讓我們寫下它在電腦記憶體中的樣子。 符號位元將為1(負數)。 指數偏移量等於 2+127 = 129₁₀ = 100000012我們 從尾數中刪除隱含的 1 ,我們得到000100000000000000000000(我們用零填充未佔用的低位)。 底線。1 10000001 00010000000000000000000 - 這就是數字 -4.25 在電腦記憶體中的儲存方式。 範例 2. 將浮點數 0.75₁0 轉換為電腦記憶體中的二進位儲存格式。結果應該是0 01111110 100000000000000000000000。感謝您的關注。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION