一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

計算機系統(tǒng)對數(shù)值類型的編碼、運算、轉(zhuǎn)換原理介紹3

jf_78858299 ? 來源:元閏子的邀請 ? 作者:元閏子 ? 2023-05-09 16:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

浮點數(shù)

考慮如下一段代碼:

// Java
public class Example {
    public static void main(String[] args) {
        int i = 12345;
        float f = 12345.0F;
        System.out.printf("binary str of i: %s\\n", int2BinaryStr(i));
        System.out.printf("binary str of f: %s\\n", float2BinaryStr(f));
    }
    // 將int轉(zhuǎn)為32位的二進(jìn)制表示
    private static String int2BinaryStr(int i) {
        String str = Integer.toBinaryString(i);
        for (int len = str.length(); len < 32; len++) {
            str = "0" + str;
        }
        return str;
    }
    // 將float轉(zhuǎn)為32位的二進(jìn)制表示
    private static String float2BinaryStr(float f) {
        return int2BinaryStr(Float.floatToRawIntBits(f));
    }
}

我們將整數(shù) i = 12345 和 浮點數(shù) f = 12345.0 轉(zhuǎn)成二進(jìn)制表示,結(jié)果如下:

binary str of i: 00000000000000000011000000111001
binary str of f: 01000110010000001110010000000000

雖然從十進(jìn)制上看,值都是 12345,但是兩種類型的二進(jìn)制表示卻差別很大,說明, 計算機系統(tǒng)對整數(shù)和浮點數(shù)的處理是兩套不同的機制 。

大部分編程語言支持的整數(shù)最大是 64 位,但很多場景下,我們需要更大的取值范圍,或者是小數(shù)運算,這些都是 64 位整數(shù)無法滿足的場景。為了解決這些,計算機系統(tǒng)引入了 浮點數(shù)Floating Point )類型。

浮點數(shù)類型可以分為 32 位單精度 float/float32 類型和 64 位雙精度 double/float64 類型,取值范圍如下:

類型 最小值 最大值
float -3.40282347E+38 3.40282347E+38
double -1.79769313486231570E+308 1.79769313486231570E+308

雖然浮點數(shù)的取值范圍很廣,但它只能精確表示其中一小部分,其他都是近似表示 。

下面,我們將深入介紹浮點數(shù)的二進(jìn)制表示和近似規(guī)則。

簡單浮點數(shù)編碼

對于十進(jìn)制數(shù) ,可以表示成 ,其中,以小數(shù)點 為界,左邊為整數(shù)部分,右邊為小數(shù)部分,那么:

比如, 。

同理,對于二進(jìn)制數(shù) ,也可以表示成 ,同樣以小數(shù)點 分割整數(shù)和小數(shù)部分,那么:

比如,。

計算機系統(tǒng)的這種編碼方式,注定只能表示 形式的數(shù),其他的,只能近似表示。

比如,無法精確表示 0.2:

二進(jìn)制表示 分?jǐn)?shù) 十進(jìn)制表示
0.0 0/2 0.0
0.01 1/4 0.25
0.010 2/8 0.25
0.0011 3/16 0.1875
0.00110 6/32 0.1875
0.001101 13/64 0.203125
0.0011010 26/128 0.203125
0.00110011 51/256 0.19921875

浮點數(shù)除了表示小數(shù)之外,還須表示大數(shù),按照這種二進(jìn)制編碼思路,如果要表示 ,需要 102 位,受限于計算機系統(tǒng)的編碼長度,這顯然不能接受。

其實,對 形式的數(shù),我們只須存儲 M 和 E 即可,再來一個符號位 s,即可表示這種形式的數(shù): 。

對 w 位浮點數(shù),可以用 1 位表示 s,用 k 位表示 E,用 n 位表示 M,那么就有 w = 1 + k + n:

圖片

(1)s 的編碼

用 0 表示正數(shù),1 表示負(fù)數(shù)。

(2)E 的編碼

二進(jìn)制表示為 ,因為 E 可以是正,也可以是負(fù),因此,可以直接用 補碼 進(jìn)行編碼。

比如,k = 4 時,E 的取值是這樣的:

e E
0000 0
0001 1
...
0111 7
1000 -8
1001 -7
...
1111 -1

但是,這樣從 到 并不是遞增的趨勢。另一種方法是,對 e 用無符號編碼,令 ,其中,。比如,k = 4 時,,那么 E 的取值是這樣的:

e Bias E
0000 7 -7
0001 7 -6
...
0111 7 0
1000 7 1
1001 7 2
...
1111 7 8

(3)M 的編碼

二進(jìn)制表示為 ,M 不涉及負(fù)數(shù),因此可以只用最高位表示整數(shù),其他表示小數(shù),即 。比如,當(dāng) n = 3 時,M 的取值如下:

m M 十進(jìn)制
000 0.00 0.00 (0/4)
001 0.01 0.25 (1/4)
010 0.10 0.5 (2/4)
011 0.11 0.75 (3/4)
100 1.00 1.00 (4/4)
101 1.01 1.25 (5/4)
110 1.10 1.5 (6/4)
111 1.11 1.75 (7/4)

但是, 這種編碼方式會導(dǎo)致 0 有很多種表示 。比如 w = 8,k = 4,n = 3 時,因為 ,所以 、、 等的浮點數(shù)值都是 0。

可以這么改動,令 ,當(dāng) 時,;當(dāng) 時,:

e m M 十進(jìn)制
0000 000 0.000 0.000 (0/8)
0000 001 0.001 0.125 (1/8)
...
0000 111 0.111 0.875 (7/8)
0001 000 1.000 1.000 (8/8)
0001 1.001 1.125 (9/8)
...

這樣,既解決了 0 的表示問題,又讓 M 的精度更大了

IEEE 浮點數(shù)編碼

上述這些編碼方法,就是 IEEE 754 Floating-Point Representation 標(biāo)準(zhǔn)中定義的浮點數(shù)編碼方式的基本思路,標(biāo)準(zhǔn)會在此基礎(chǔ)上做了一些調(diào)整,比如新增了 Infinity 和 NaN 的表示。

IEEE 標(biāo)準(zhǔn)將浮點數(shù)分成 單精度雙精度 兩種,分別用 32 位和 64 位表示,它們的 k 值和 n 值都不同:

圖片

在此基礎(chǔ)上,根據(jù) e 的取值不同,又分為 3 種場景, Denormalized ValuesNormalized Values 、 Special Values

圖片

(1)Denormalized Values

此場景下,e 取值為全 0, 用來表示 0 值,以及接近 0 的小數(shù)

在 的表示下,,。

為什么 ,而不是 E = -Bias ?

根據(jù)前文分析,應(yīng)該有 E = e - Bias,但 Denormalized Values 中,確是 E = 1 - Bias,而不是 E = 0 - Bias。

這主要考慮到,從 Denormalized Values 到 Normalized Values 的平滑過度,讓 Largest Denormalized Value 和 Smallest Normalized Value 更接近。后面的舉例可以看到。

這里,0 分為了 -0.0 和 +0.0,在一些科學(xué)計算場景下,它們會表示不同的含義。比如 ,。

(2) Normalized Values

此場景下,e 取值不是全 0,也不是全 1,是最常見的場景。

在 的表示下,,。

(3)Special Values

此場景下,e 取值為全 1,用來表示 Infinity 和 NaN。

  • m 取值全 0,表示 Infinity:1)s = 0 時,為 ;2)s = 1 時,為 。
  • m 取值不是全 0,表示 NaN(Not a Number),比如 或者 。

比如,w = 8,k = 4(此時,),n = 3 時,IEEE 標(biāo)準(zhǔn)浮點數(shù)的編碼例子如下:

場景 二進(jìn)制 e E m M 十進(jìn)制
Denormalized 0 0000 000 0 -6 1/64 0/8 0/8 0/512 0.0
0 0000 001 0 -6 1/64 1/8 1/8 1/512 0.001953
...
0 0000 111 0 -6 1/64 7/8 7/8 7/512 0.013672
Normalized 0 0001 000 1 -6 1/64 0/8 8/8 8/512 0.015625
0 0001 001 1 -6 1/64 1/8 9/8 9/512 0.017578
...
0 1110 111 14 7 128 7/8 15/8 1920/8 240.0
Infinity 0 1111 000 - - - - - -
NaN 0 1111 001 - - - - - - NaN
... NaN

從上表可以看出,因為 Denormalized 場景下令 E = 1 - Bias,從 Denormalized 到 Normalized 的過度,也即 7/512 到 8/512,更平滑了。如果令 E = - Bias,則是從 7/1024 到 8/512,跨度太大。

到這里,我們已經(jīng)深入介紹了 IEEE 浮點數(shù)編碼格式,回到本節(jié)最開始的例子,如何從 int i = 12345 的二進(jìn)制表示,推斷出 float f = 12345.0 的二進(jìn)制表示?

  1. 首先,12345 整數(shù)的二進(jìn)制表示為 ,也可以表示成 ,對應(yīng)到 的形式,可以確認(rèn) s = 0,E = 13,M = 1.1000000111001。
  2. 另外,12345 屬于 Normalized 場景,而 float 類型中 k = 8,有,,得出 e = 140,按 k 位無符號編碼表示為 。
  3. 同理,由 ,float 類型中,n = 23,所以,得出 m 的二進(jìn)制表示為 ,注意, 低位補零
  4. 最后將 s、e、m 按照 float 單精度的編碼格式組合起來,就是 ,也即 12345.0 的二進(jìn)制編碼。

近似規(guī)則(Rounding)

前面說過,浮點數(shù)只能表示 形式的數(shù),其他的,只能近似表示。

近似規(guī)則,我們最熟悉的是 “ 四舍五入 ”,比如,要保留 2 位小數(shù),那么 1.234、1.235、1.236 近似之后分別是 1.23、1.24、1.24。

IEEE 浮點數(shù)標(biāo)準(zhǔn)中,并沒采用 “四舍五入” 法,定義了如下 4 種近似規(guī)則:

  • Round-to-even ,往更近的方向靠,如果向上和向下的距離一樣,則往偶數(shù)的方向靠。
  • Round-toward-zero ,往 0 的方向靠。
  • Round-down ,往更小的方向靠。
  • Round-up ,往更大的方向靠。

比如,下面的例子,需要近似為整數(shù):

規(guī)則 1.40 1.60 1.50 2.50 -1.50
Round-to-even 1 2 2 2 -2
Round-toward-zero 1 1 1 2 -1
Round-down 1 1 -2
Round-up 2 2 3 -1

這些規(guī)則對二進(jìn)制也生效,比如,Round-to-even 規(guī)則,在二進(jìn)制中,0 代表偶數(shù),1 表示奇數(shù)。下面例子中,需要按照 Round-to-even 近似保留 2 位小數(shù):

二進(jìn)制(十進(jìn)制) 向下 中點 向上 Round-to-even
10.00011 (67/32) 10.00 (64/32) 68/32 10.01 (72/32) 10.00 (64/32)
10.00110 (70/32) 10.00 (64/32) 68/32 10.01 (72/32) 10.01 (72/32)
10.11100 (23/8) 10.11 (22/8) 23/8 11.00 (24/8) 11.00 (24/8)
10.10100 (21/8) 10.10 (20/8) 21/8 10.11 (22/8) 10.10 (20/8)

上述例子中,前 2 個按照就近原則近似;后 2 個處于中點位置,往偶數(shù)方向靠。

圖片

注意, IEEE 標(biāo)準(zhǔn)規(guī)定 Round-to-even 為默認(rèn)的近似規(guī)則 。

浮點數(shù)運算

浮點數(shù)的運算規(guī)則比較簡單,令 指代后一類的運算符,x 和 y 為浮點數(shù)類型,那么 的運算結(jié)果為 ,也即對真實計算結(jié)果進(jìn)行近似。

注意,算術(shù)運算的 結(jié)合律分配率在浮點數(shù)運算下是不生效的,比如:

// Java
public static void main(String[] args) {
    // 結(jié)合律不滿足示例
    float f1 = 3.14F;
    float f2 = 1e10F;
    float f3 = (f1 + f2) - f2;
    float f4 = f1 + (f2 - f2);
    System.out.printf("(3.14 + 1e10) - 1e10 = %f\\n", f3);
    System.out.printf("3.14 + (1e10 - 1e10) = %f\\n", f4);

    // 分配律不滿足示例
    float f5 = 1e20F;
    float f6 = f5 * (f5 - f5);
    float f7 = f5 * f5 - f5 * f5;
    System.out.printf("1e20 * (1e20 - 1e20) = %f\\n", f6);
    System.out.printf("1e20 * 1e20 - 1e20 * 1e20 = %f\\n", f7);
}
// 輸出結(jié)果
(3.14 + 1e10) - 1e10 = 0.000000
3.14 + (1e10 - 1e10) = 3.140000
1e20 * (1e20 - 1e20) = 0.000000
1e20 * 1e20 - 1e20 * 1e20 = NaN

結(jié)合律例子中,(3.14+1e10)-1e10 結(jié)果是 0,因為 3.14 在近似時,精度丟失了,也即 3.14+1e10=1e10;類似,分配律例子中,1e20*1e20 的結(jié)果超出了 float 類型的表示范圍,得到 Infinity,而 Infinity - Infinity 的結(jié)果是 NaN。

注意, 浮點數(shù)運算結(jié)果,如果超出了浮點數(shù)表示范圍,會得到 Infinity/-Infinity 。這與整數(shù)運算的溢出機制有所區(qū)別。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 二進(jìn)制
    +關(guān)注

    關(guān)注

    2

    文章

    807

    瀏覽量

    42318
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7662

    瀏覽量

    90760
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95238
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    計算機系統(tǒng)結(jié)構(gòu)

    計算機系統(tǒng)結(jié)構(gòu)
    發(fā)表于 05-09 19:03

    什么是計算機系統(tǒng)、計算機硬件和計算機軟件?

    第一章 計算機系統(tǒng)概論1. 什么是計算機系統(tǒng)、計算機硬件和計算機軟件?硬件和軟件哪個更重要?解:P3計算
    發(fā)表于 07-22 09:06

    什么是計算機系統(tǒng)?硬件和軟件哪個更重要?

    第一章計算機系統(tǒng)概論1 .什么是計算機系統(tǒng)、計算機硬件和計算機軟件?硬件和軟件哪個更重要?解: P3計算
    發(fā)表于 07-26 07:18

    計算機系統(tǒng)中的軟件系統(tǒng)

    專用計算機現(xiàn)代計算機運算速度最高可達(dá)每秒幾萬億次幾十億次幾億次幾萬次計算機輔助制造是計算機應(yīng)用領(lǐng)域之一其英文縮寫是所謂的信息是指基本素材非數(shù)值
    發(fā)表于 09-13 07:22

    嵌入式計算機系統(tǒng)概述

    硬件子系統(tǒng)和軟件子系統(tǒng)組成的,通過運行程序來協(xié)同工作計算機硬件:基本的計算機硬件系統(tǒng)運算器、控
    發(fā)表于 12-22 06:08

    簡單介紹微型計算機的組成

    你了解自己的計算機?或者知道單片機的組成嗎?這一小節(jié)主要簡單介紹微型計算機的組成,以及微型計算機系統(tǒng)經(jīng)常用到的概念,包括組成、工作過程、工作原理、數(shù)
    發(fā)表于 01-10 07:11

    計算機系統(tǒng)概論

    1.1 計算機系統(tǒng)簡介1.2 計算機的基本組成1.3 計算機硬件的主要技術(shù)指標(biāo)1.4 本書結(jié)構(gòu)
    發(fā)表于 04-11 09:31 ?0次下載

    微型計算機系統(tǒng)

             微型計算機系統(tǒng)與傳統(tǒng)的計算機系統(tǒng)一樣,也是由硬件系統(tǒng)和軟件系統(tǒng)兩大部分組成的。2.1
    發(fā)表于 03-03 08:31 ?0次下載

    什么是計算機系統(tǒng)的容錯性

    什么是計算機系統(tǒng)的容錯性             所謂容錯是指在故障存在的情況下計算機系統(tǒng)不失效,仍然能夠正常工作的特性
    發(fā)表于 01-08 13:49 ?1717次閱讀

    深入理解計算機系統(tǒng)數(shù)值類型

    計算機系統(tǒng)中,整數(shù)可以分成 無符號(unsigned)整數(shù) 和 有符號(signed)整數(shù) 兩大類,這之下,按照類型表示的 bit 位大小,又可細(xì)分成 8 位的 char/byte/int8
    的頭像 發(fā)表于 08-19 15:17 ?1571次閱讀

    計算機系統(tǒng)對數(shù)值類型編碼、運算、轉(zhuǎn)換原理介紹1

    。正因太熟悉,我們往往不會深究它們的底層原理。因為平時的工作中,知道個大概,也夠用了。 但,在某些業(yè)務(wù)場景下,比如金融業(yè)務(wù),數(shù)值運算不準(zhǔn)確會帶來災(zāi)難性的后果。這時,你就必須清楚數(shù)值類型
    的頭像 發(fā)表于 05-09 16:30 ?1383次閱讀
    <b class='flag-5'>計算機系統(tǒng)</b><b class='flag-5'>對數(shù)值</b><b class='flag-5'>類型</b>的<b class='flag-5'>編碼</b>、<b class='flag-5'>運算</b>、<b class='flag-5'>轉(zhuǎn)換</b>原理<b class='flag-5'>介紹</b>1

    計算機系統(tǒng)對數(shù)值類型編碼、運算、轉(zhuǎn)換原理介紹2

    。正因太熟悉,我們往往不會深究它們的底層原理。因為平時的工作中,知道個大概,也夠用了。 但,在某些業(yè)務(wù)場景下,比如金融業(yè)務(wù),數(shù)值運算不準(zhǔn)確會帶來災(zāi)難性的后果。這時,你就必須清楚數(shù)值類型
    的頭像 發(fā)表于 05-09 16:31 ?1104次閱讀
    <b class='flag-5'>計算機系統(tǒng)</b><b class='flag-5'>對數(shù)值</b><b class='flag-5'>類型</b>的<b class='flag-5'>編碼</b>、<b class='flag-5'>運算</b>、<b class='flag-5'>轉(zhuǎn)換</b>原理<b class='flag-5'>介紹</b>2

    計算機系統(tǒng)對數(shù)值類型編碼運算、轉(zhuǎn)換原理介紹4

    。正因太熟悉,我們往往不會深究它們的底層原理。因為平時的工作中,知道個大概,也夠用了。 但,在某些業(yè)務(wù)場景下,比如金融業(yè)務(wù),數(shù)值運算不準(zhǔn)確會帶來災(zāi)難性的后果。這時,你就必須清楚數(shù)值類型
    的頭像 發(fā)表于 05-09 16:31 ?704次閱讀
    <b class='flag-5'>計算機系統(tǒng)</b><b class='flag-5'>對數(shù)值</b><b class='flag-5'>類型</b>的<b class='flag-5'>編碼</b>、<b class='flag-5'>運算</b>、<b class='flag-5'>轉(zhuǎn)換</b>原理<b class='flag-5'>介紹</b>4

    計算機系統(tǒng)中的關(guān)鍵組件有哪些

    計算機系統(tǒng)中,關(guān)鍵組件的協(xié)同工作構(gòu)成了其強大的數(shù)據(jù)處理和運算能力。這些組件不僅決定了計算機的性能,還影響著用戶的使用體驗。以下是對計算機系統(tǒng)中關(guān)鍵組件的詳細(xì)闡述,包括它們的定義、功能
    的頭像 發(fā)表于 07-15 18:18 ?2555次閱讀

    微處理器如何控制計算機系統(tǒng)

    微處理器,作為計算機系統(tǒng)的核心部件,承擔(dān)著控制整個計算機系統(tǒng)運行的重要任務(wù)。它不僅是計算機運算中心,還是控制中心,負(fù)責(zé)執(zhí)行程序指令、處理數(shù)據(jù)以及協(xié)調(diào)
    的頭像 發(fā)表于 08-22 14:21 ?975次閱讀