這篇文章主要講解了“計(jì)算機(jī)的數(shù)值問題有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“計(jì)算機(jī)的數(shù)值問題有哪些”吧!
成都創(chuàng)新互聯(lián)公司主營鶴山網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),鶴山h5微信小程序開發(fā)搭建,鶴山網(wǎng)站營銷推廣歡迎鶴山等地區(qū)企業(yè)咨詢
機(jī)器數(shù):數(shù)值在計(jì)算機(jī)內(nèi)部的編碼,也就是實(shí)際存儲(chǔ)的 0/1 序列。
真值:機(jī)器數(shù)想要表示的實(shí)際數(shù)值,可理解為現(xiàn)實(shí)生活中我們平常所用的有正負(fù)號(hào)的數(shù)。
機(jī)器數(shù)與真值的對(duì)應(yīng)關(guān)系就是數(shù)值在計(jì)算機(jī)內(nèi)部的編碼,主要有 4 種:原碼,反碼,補(bǔ)碼,移碼。
原碼由 1 位符號(hào)位和數(shù)值部分組成,數(shù)值部分就是真值的絕對(duì)值。
特點(diǎn)
與真值的對(duì)應(yīng)關(guān)系直觀
0 的表示不唯一,有 +0(00...000) 和 -0(10...000)。
加減法復(fù)雜,需要判斷符號(hào)
反碼由 1 位符號(hào)位和數(shù)值部分組成。表示一個(gè)正數(shù)時(shí)同原碼;表示一個(gè)負(fù)數(shù)時(shí),符號(hào)位不變,數(shù)值部分各位求反。
反碼相對(duì)于原碼并沒有多大改進(jìn)提升,現(xiàn)已不用來表示數(shù)據(jù)。
補(bǔ)碼也是由 1 位符號(hào)位和數(shù)值部分組成。表示一個(gè)整數(shù)時(shí)同原碼;表示一個(gè)負(fù)數(shù)時(shí),符號(hào)位不變,數(shù)值部分各位求反,末位加 1。
原碼到補(bǔ)碼快速轉(zhuǎn)換(負(fù)數(shù)):符號(hào)位不變,從右到左的第一個(gè)1不變,其他位取反。 補(bǔ)碼到原碼(負(fù)數(shù))轉(zhuǎn)換方法同上,符號(hào)位不變,數(shù)值部分各位求反,末位加 1。也就是說符號(hào)位不變,從右到左的第一個(gè)1不變,其他位取反。
原因:按理說補(bǔ)碼到原碼應(yīng)為原碼到補(bǔ)碼的逆操作,即減 1 再求反。設(shè)補(bǔ)碼為A,則原碼為 ~(A - 1),即11...111 - ( A - 1) = 11...111 - A + 1,也就是~A + 1。 因此 ~A + 1 = ~(A - 1)
一個(gè)數(shù)的補(bǔ)碼取負(fù):連同符號(hào)位各位求反,末位加1,即從右到左的第一個(gè)1不變,其他位取反。
例如 4 位補(bǔ)碼,[x]~補(bǔ)~ = 1011,[-x]~補(bǔ)~ = 0101
特點(diǎn)
0有唯一表示00...000,所以補(bǔ)碼能表示的數(shù)范圍比原碼反碼多1,表示范圍為 -2^n-1^ ~ 2^n-1^-1
加減法符號(hào)位能直接參與運(yùn)算。
現(xiàn)代的計(jì)算機(jī)整數(shù)基本都采用補(bǔ)碼表示。
移碼主要用于浮點(diǎn)數(shù)的階碼部分,后面會(huì)講浮點(diǎn)數(shù)的階有正負(fù),兩個(gè)浮點(diǎn)數(shù)比較時(shí)需要比較階碼來対階。為方便比較,將階加上一個(gè)偏置常數(shù)使其變成正數(shù),因?yàn)榧拥亩际峭粋€(gè)偏置常數(shù),階的差值也是不會(huì)改變的。
所以移碼就是數(shù)值本身加上一個(gè)偏置常數(shù)得到,偏置常數(shù)一般是2^n-1^,或者2^n-1^-1。
上述都是定點(diǎn)數(shù)的表示方法,定點(diǎn)數(shù)顧名思義,小數(shù)點(diǎn)是約定不動(dòng)在一個(gè)固定位置的。定點(diǎn)數(shù)分為定點(diǎn)小數(shù)和定點(diǎn)整數(shù)。
定點(diǎn)整數(shù)的小數(shù)點(diǎn)固定在數(shù)的最右邊,一般用來表示整數(shù)。
定點(diǎn)小數(shù)的小數(shù)點(diǎn)固定在數(shù)的左邊,一般表示浮點(diǎn)數(shù)的尾數(shù)部分。
而浮點(diǎn)數(shù)的表示類似于科學(xué)計(jì)數(shù)法,它的指數(shù)部分可以變動(dòng),相應(yīng)的尾數(shù)部分也跟著變化,就像小數(shù)點(diǎn)在浮動(dòng)一樣,所以叫做浮點(diǎn)數(shù),浮點(diǎn)數(shù)后面再詳解。
整數(shù)分為無符號(hào)整數(shù)和有符號(hào)整數(shù),**給定一個(gè)數(shù),在計(jì)算機(jī)里如何存儲(chǔ),表示成 0/1 序列是編碼的事,而對(duì)這 0/1 序列如何解釋是上層軟件的事情。**如c語言中可解釋為有符號(hào)數(shù)和無符號(hào)數(shù),而java中只解釋為有符號(hào)數(shù)。
數(shù)值比較時(shí),得確定類型才能比較。通常默認(rèn)為有符號(hào)數(shù)相比,若出現(xiàn)無符號(hào)數(shù),則按照無符號(hào)數(shù)相比。
概念模糊抽象,看下面的經(jīng)典例子來理解:
第一個(gè):兩數(shù)按照有符號(hào)數(shù)相比,11...111B(-1) < 00...000B(0) 第二個(gè):0U為無符號(hào)數(shù),所以兩數(shù)按照無符號(hào)數(shù)相比,-1的機(jī)器數(shù)為11...111,按照無符號(hào)數(shù)解釋為2^32^ -1,這時(shí)是大于0的。11...111(2^32^-1) > 00...000(0)
注:括號(hào)前的二進(jìn)制表示為數(shù)值的機(jī)器數(shù),通常由補(bǔ)碼表示,括號(hào)里面的是c語言對(duì)機(jī)器數(shù) 按照無符號(hào)數(shù)或者有符號(hào)數(shù) 解釋出來的數(shù)。
看第二個(gè)例子前補(bǔ)充一些知識(shí):
判斷一個(gè)常量類型時(shí)是先將符號(hào)“踢開”,只看后面的數(shù)值在哪個(gè)區(qū)間,根據(jù)區(qū)間確定類型。
c90 和 C99 是c語言的兩套標(biāo)準(zhǔn),兩套標(biāo)準(zhǔn)對(duì)常量的處理不同,下面的例子以 C90 說明
第一個(gè):2147483647為 int 型,兩邊按照有符號(hào)數(shù)相比,01...111B(2^31^ - 1) > 10...000B(-2^31^)
第二個(gè):2147483647為 int 型,前者帶有U表示無符號(hào)數(shù),按照無符號(hào)數(shù)相比,01...111B(231 - 1) < 10...000B(231)
第三個(gè):2147483648為 unsigned int 型,但被強(qiáng)制類型轉(zhuǎn)換為int型,所以按照有符號(hào)數(shù)相比,01...111B(2^31 -1^) < 10...000B(-2^31^)
第四個(gè):2147483648為 unsigned int 型,兩數(shù)按照無符號(hào)數(shù)相比,01...111B(2^31^ -1) < 10...000B(2^31^)
完全理解上述幾個(gè)例子后對(duì)數(shù)值比較這一塊應(yīng)該沒問題了,在此再強(qiáng)調(diào)總結(jié)一番。
一個(gè)數(shù)據(jù)怎么存儲(chǔ)成 0/1 序列是編碼的事,怎么解釋這個(gè) 0/1 序列是上層軟件的事。
也就是說上述的數(shù)值比較中 2147483648 的機(jī)器數(shù)始終是10...000B,2147483647的機(jī)器數(shù)始終是01...111B,之所以出現(xiàn)不同的比較結(jié)果是因?yàn)?c 語言對(duì)它們進(jìn)行了不同的解釋處理。
有了上面的基礎(chǔ),再來看幾個(gè)程序:
打印結(jié)果如上圖注釋,原因如下:
x 的機(jī)器數(shù)為 11...111,u 的機(jī)器數(shù)為 10...0000 所以x按照無符號(hào)數(shù)解釋為2^32^ - 1 = 4294967295,按照有符號(hào)數(shù)解釋為 -1。 u按照無符號(hào)數(shù)解釋為 2^31^,按照有符號(hào)數(shù)解釋為 -2^31^
由上也可以看出機(jī)器數(shù)為10...000的數(shù),是能表示的最小整數(shù),取負(fù)后溢出還是它本身。
這是計(jì)算數(shù)組元素和的一個(gè)函數(shù),按照程序所設(shè)想,length 傳入 0 時(shí)應(yīng)該返回 0,但實(shí)際上并非如此。這個(gè)程序理論上會(huì)無限循環(huán),實(shí)際運(yùn)行時(shí)會(huì)發(fā)生數(shù)組越界導(dǎo)致異常。
理論上無限循環(huán)的原因:len 為無符號(hào)數(shù),傳入0時(shí),len - 1 為 -1,機(jī)器數(shù)為11...111,按無符號(hào)數(shù)解釋為2^32^ -1,是 32 位能表示的最大整數(shù)。
前面說過,有無符號(hào)數(shù)參與比較時(shí),兩邊都按照無符號(hào)數(shù)相比,所以不管 i 怎么變化,始終小于等于右邊那個(gè)最大的值。當(dāng) i = 2^32^ -1 時(shí),下一步又會(huì)回繞到0;
但實(shí)際運(yùn)行時(shí),肯定不會(huì)有那么長的數(shù)組,所以會(huì)發(fā)生越界錯(cuò)誤。
此函數(shù)時(shí)用來比較兩個(gè)字符串str1, str2誰長,用到了庫函數(shù)strlen(),其原型如上。此函數(shù)設(shè)想 str1 長時(shí)返回 1,否則返回 0;但實(shí)際上只有 str1 和 str2 長度相等時(shí)會(huì)返回 0,其他時(shí)候都返回1;
問題就出在函數(shù)strlen()的返回值是size_t,即unsigned int。也就是說比較是按照無符號(hào)數(shù)來比較的,無符號(hào)數(shù)永遠(yuǎn)是大于等于 0 的,所以只有兩個(gè)串兒長度相等時(shí)會(huì)使左邊式子等于 0,其他時(shí)候左邊結(jié)果的機(jī)器數(shù)中肯定有非 0 位,那么按無符號(hào)數(shù)解釋就會(huì)大于0,也就返回1了。
改進(jìn)方法:返回語句改成return strlen(str1) > strlen(str2),直接讓兩個(gè)串的長度比較,而不是做減法再與0比較。
這個(gè)例子說明調(diào)用庫函數(shù)也要小心,對(duì)其的返回類型,參數(shù)類型要有了解,否則可能就會(huì)出錯(cuò)。
IEEE 754浮點(diǎn)數(shù)標(biāo)準(zhǔn)規(guī)定的浮點(diǎn)數(shù)格式如上圖所示,簡要解釋如下:
符號(hào)位:1表負(fù),0表正
階碼用移碼表示,是一個(gè)定點(diǎn)整數(shù),偏置常數(shù)是2n - 1,所以單精度的偏置常數(shù)位127,雙精度的偏置常數(shù)位1023
尾數(shù)是一個(gè)定點(diǎn)小數(shù),實(shí)際表示24位有效數(shù)字,隱含了一位 1 ,實(shí)際尾數(shù)為1.*****B
負(fù)數(shù)的表示只不過是符號(hào)位發(fā)生變化,所以32位單精度浮點(diǎn)數(shù)能表示的極值如下:
最小正數(shù):2-126
最大整數(shù):(2 - 2-23) * 2127
最大負(fù)數(shù):-2-126
最小負(fù)數(shù):-(2 - 2-23) * 2127
64位雙精度浮點(diǎn)數(shù)原理同上,能表示的極值如下
最小正數(shù):2-1022
最大整數(shù):(2 - 2-52) * 21023
最大負(fù)數(shù):-2-1022
最小負(fù)數(shù):-(2 - 2-52) * 21023
所以IEEE 754 浮點(diǎn)數(shù)能表示的范圍如下面數(shù)軸圖所示:
浮點(diǎn)數(shù)每個(gè) 2^n-1^~2^n^ 區(qū)間內(nèi)能表示的數(shù)的個(gè)數(shù)都是2^23^個(gè)(尾數(shù)23位),而且等距。比如 1~2 之間有 2^23^ 個(gè)數(shù),2~4 之間也有 2^23 ^個(gè)等距的數(shù),所以浮點(diǎn)數(shù)表示的密度并不相等,距離0越近,密度越大。
也就是說并不是每個(gè)小數(shù)都能精確表示,當(dāng)輸入一個(gè)不可表示的數(shù)時(shí),機(jī)器會(huì)將其轉(zhuǎn)換為最近能表示的數(shù)。這也是為什么編寫程序時(shí)不要用浮點(diǎn)數(shù)來進(jìn)行比較,特別是相等的情況,因?yàn)槟阆氡容^的數(shù)可能無法表示,機(jī)器自動(dòng)給你轉(zhuǎn)換了。
+0 或者 -0,正負(fù)看符號(hào)位
+∞,-∞,正負(fù)看符號(hào)位
階碼全1尾數(shù)非0,NaN(Not a Number),不是一個(gè)數(shù),0 / 0, 0 * ∞ 等會(huì)產(chǎn)生NaN。
從上述的數(shù)軸圖中可以看出-2^-126^ ~ 2^-126^之間的數(shù)是表示不了的,引進(jìn)非規(guī)格化數(shù)可解決這問題。非規(guī)格化數(shù)的尾數(shù)中的隱含位為0,階碼雖然全0,但階還是-126。如此便在-2^-126^~2^-126^之間添加了2 * 2^23^個(gè)數(shù),解決了下溢問題。
同樣,有了上述的基礎(chǔ)知識(shí),來看一些例子:
這幾個(gè)題都很簡單,注意幾點(diǎn)就行:
精度大的轉(zhuǎn)換成精度小的可能會(huì)出問題,精度小的轉(zhuǎn)換成精度大的不會(huì)有問題。
浮點(diǎn)數(shù)取負(fù)直接變符號(hào)位就可。
最后一個(gè)是浮點(diǎn)數(shù)的加減運(yùn)算問題,后面詳解,在這可以舉個(gè)例子簡單理解下:當(dāng) d 很大 f 很小時(shí),d + f 得到的結(jié)果就等于 d, 舍去了f,所以左邊等于 0 ,右邊等于 f,兩邊不等。
這兩種運(yùn)算比較簡單,只是要區(qū)分一下概念。
按位運(yùn)算恰如其名,是對(duì)數(shù)值的位進(jìn)行與或非運(yùn)算。
邏輯運(yùn)算的操作數(shù)只有 true 和 false,對(duì)數(shù)值的處理為非零即真。
移位分為邏輯移位和算數(shù)移位:
邏輯移位:不考慮符號(hào)位,左移時(shí)高位移出,低位補(bǔ)0;右移時(shí)低位移出,高位補(bǔ)0
算術(shù)移位:考慮符號(hào)位,左移時(shí)高位移出,低位補(bǔ)0;右移時(shí)低位移出,高位補(bǔ)符號(hào)位;
c語言中編譯器進(jìn)行移位運(yùn)算和CPU進(jìn)行移位運(yùn)算是不一樣的:
編譯器:進(jìn)行實(shí)際移位,比如移動(dòng)w位,實(shí)際也移動(dòng)w位
CPU:移動(dòng) w % k ,w為所移位數(shù),k為數(shù)據(jù)類型的位數(shù)
看下面程序幫助理解,打印結(jié)果已注釋在后面
擴(kuò)展分為 0 擴(kuò)展和符號(hào)擴(kuò)展,數(shù)據(jù)轉(zhuǎn)換時(shí),短數(shù)向長數(shù)轉(zhuǎn)換時(shí)需要位擴(kuò)展。
0擴(kuò)展用于無符號(hào)數(shù),在原來的數(shù)前面添足夠的0即可。
符號(hào)擴(kuò)展用于有符號(hào)數(shù),在原來的數(shù)前面添足夠的符號(hào)位即可。
位截?cái)啵L數(shù)向短數(shù)轉(zhuǎn)化時(shí)會(huì)發(fā)生截?cái)?,?guī)則比較粗暴簡單,直接“砍掉”高位,留下低位即可。
長數(shù)的表示范圍肯定大于短數(shù),所以截?cái)嘁粋€(gè)數(shù)可能會(huì)改變?cè)瓉淼闹???聪旅嬉粋€(gè)例子:
經(jīng)過截?cái)嘣贁U(kuò)展后 32768 變成了 -32768,所以再截?cái)鄷r(shí)要注意溢出問題。
計(jì)算機(jī)里整數(shù)浮點(diǎn)數(shù)的加減乘除運(yùn)算的實(shí)際過程都很復(fù)雜,內(nèi)容很多,建議直接看唐朔風(fēng)的計(jì)算機(jī)組成原理第六章,數(shù)字邏輯相關(guān)書籍中加法器,乘法器等的電路實(shí)現(xiàn)。深入理解計(jì)算機(jī)系統(tǒng)對(duì)各種數(shù)值算法的理論推導(dǎo)。公眾號(hào)內(nèi)回復(fù)電子書即可獲得相應(yīng)書籍。下面就只說說其中我認(rèn)為比較重要需要的一些東西。
現(xiàn)代計(jì)算機(jī)里面整數(shù)都可以看做是用補(bǔ)碼表示的,統(tǒng)一了加減法,符號(hào)位也能和數(shù)值部分一起進(jìn)行計(jì)算。
不論是無符號(hào)數(shù)還是有符號(hào)數(shù),都先按照實(shí)際的機(jī)器數(shù)做運(yùn)算,得到的結(jié)果再解釋成相應(yīng)的無符號(hào)數(shù)或有符號(hào)數(shù)。
整個(gè)計(jì)算機(jī)的運(yùn)算系統(tǒng)都是采用模運(yùn)算,得出的結(jié)果如果超出計(jì)算機(jī)表示的位數(shù),會(huì)直接丟掉高位。
例如若兩個(gè)數(shù)為a, b,對(duì)應(yīng)的機(jī)器數(shù)為A, B,則a + b 相應(yīng)操作為 A + B,a - b 為A + ~ B + 1。再對(duì)計(jì)算得到機(jī)器數(shù)解釋成最終結(jié)果。
乘法主要需要考慮溢出問題,n 位數(shù)乘 n 位數(shù),結(jié)果可能需要2n位來表示。c語言中截直接斷成 n 位來實(shí)現(xiàn)(來自深入理解計(jì)算機(jī)系統(tǒng)),但經(jīng)過試驗(yàn)結(jié)果似乎會(huì)自動(dòng)擴(kuò)展。
只要結(jié)果在你機(jī)器的表示范圍內(nèi)就會(huì)自動(dòng)擴(kuò)展,比如兩個(gè) short 型的數(shù)相乘結(jié)果會(huì)自動(dòng)擴(kuò)展成 32 位來正確表示結(jié)果,除非限定結(jié)果還是個(gè) short 型,才會(huì)截?cái)唷?/p>
整數(shù)除法一般沒有溢出問題,因?yàn)樯痰慕^對(duì)值不會(huì)大于被除數(shù)的絕對(duì)值。
除了一種情況,有符號(hào)數(shù)中最小數(shù)除以-1,例如 int 型的情況:-2147483648 / -1 便會(huì)溢出,結(jié)果還是 -2147483648 本身。
在這說點(diǎn) c 里面一些有趣的東西,可以算是bug吧。上述說的有符號(hào)數(shù)中的最小數(shù),即機(jī)器數(shù)為10...000的數(shù)(設(shè)為s)取負(fù)后還是它本身,這是沒問題的,機(jī)器數(shù)也的確是相同的。所以按理說 s = -s。這在32位int型,64位long long的情況下成立,但是在short情況下不成立。所以 c 里面關(guān)于數(shù)值的東西有許多奇奇怪怪的東西,諸位感興趣可以去嘗試。
乘除法運(yùn)算所花的時(shí)間遠(yuǎn)遠(yuǎn)多于移位加減運(yùn)算的時(shí)間,因此,編譯器處理變量與常量乘除時(shí)會(huì)以移位,加法,減法的組合運(yùn)算來代替乘除法。
來看一個(gè)具體例題:x為一整形變量,現(xiàn)要計(jì)算55 * x,給出一種計(jì)算表達(dá)式使得所用的時(shí)鐘周期最少。
題目很簡單,主要是想說明怎么轉(zhuǎn)換。
乘以 2^n^ 相當(dāng)于左移 n 位,除以 2^n^ 相當(dāng)于右移 n 位。 **左移需要注意高位的溢出問題,而右移則需要注意舍入問題。一般的舍入規(guī)則是向0舍入,但用移位來實(shí)現(xiàn)除法是向下舍入的。**對(duì)于正數(shù)來說沒什么問題,向下舍入就是向0舍入。但是負(fù)數(shù)就有問題了,向下舍入并不是向0舍入,需要校正。
為什么移位來實(shí)現(xiàn)除法是向下舍入的呢,正數(shù)應(yīng)該很好理解,右移之后丟掉移出的小數(shù)部分,數(shù)值自然變小了。如果是負(fù)數(shù),右移之后丟掉小數(shù)部分?jǐn)?shù)值不應(yīng)該變大嗎?但別忘了負(fù)數(shù)在計(jì)算機(jī)里由補(bǔ)碼表示,它跟真值對(duì)應(yīng)的關(guān)系是要求反的,所以換成真值后會(huì)發(fā)現(xiàn)數(shù)值依然是變小的。
來看一個(gè)例子理解向下舍入,應(yīng)該會(huì)更清楚
如何校正呢? 既然負(fù)數(shù)也是向下舍入,那么在它移位之前先給它加上一個(gè)偏移量讓它變大點(diǎn),那么移位后舍入不就正確了。
如果右移n位,這個(gè)偏移量就是2^n^-1,原來是 x / 2^n^,現(xiàn)在是(x + 2^n^ - 1) / 2n = x / 2^n^ + (2^n^-1 / 2^n^);相當(dāng)于加了一個(gè)"極限小數(shù)"來校正。
這個(gè)數(shù)可以在十進(jìn)制下來理解,比如移動(dòng)一位也就是一位小數(shù)的情況下,-2.1,-2.9都要舍入到-2,應(yīng)該怎么操作呢?將兩個(gè)數(shù)都加上一個(gè)0.9就行了,這里0.9就是十進(jìn)制一位情況下的一個(gè)極限小數(shù),換成二進(jìn)制同理,二進(jìn)制 n 位的一個(gè)"極限小數(shù)"就是2^n^-1 。
1、対階
只有階數(shù)相等,尾數(shù)才能直接相加減。 対階原則:小階對(duì)齊大階,階小的尾數(shù)右移,右移尾數(shù)為階差。
注: 右移時(shí)注意隱含位 1 也要一起參與移位,為保證精度,低位移出的位不要丟掉,后續(xù)參與尾數(shù)加減。
2、尾數(shù)加減
尾數(shù)是由定點(diǎn)原碼小數(shù)表示,這里沒有符號(hào)位,所以加減就是普通的二進(jìn)制加減法。這里注意隱含位和対階時(shí)移出的附加位也要參與運(yùn)算。
3、規(guī)格化
上述尾數(shù)加減后得到結(jié)果可能五花八門,千奇百怪,需要規(guī)格化變成 IEEE 754 的標(biāo)準(zhǔn)形式。**簡單說來就是把尾數(shù)變成1. **B的形式,然后相應(yīng)的調(diào)整階碼。小數(shù)點(diǎn)的位置與階碼息息相關(guān),小數(shù)點(diǎn)浮動(dòng)了,階碼當(dāng)然也要相應(yīng)變化。
4、結(jié)果舍入
対階和尾數(shù)規(guī)格化的時(shí)都可能右移,為保證精度,會(huì)將移出的位保留下來參與中間運(yùn)算,得出最終結(jié)果后再舍入。IEEE 754規(guī)定至少保留 2 位,緊跟在尾數(shù)右邊的叫做保護(hù)位(guard),保護(hù)位右邊的叫做舍入位(round),為提高精度,舍入位右邊還有一位粘位(sticky)。只要粘位右邊有任何的非0數(shù)就置1,否則置0。
5、階碼溢出判斷
結(jié)果的階碼全 1 表上溢,產(chǎn)生異?;蛘呓Y(jié)果置為∞。 結(jié)果的階碼全 0 表下溢,產(chǎn)生異?;蛘呓Y(jié)果置0
這就能解釋前面為什么 (d + f ) - d 不一定等于 f ,d 如果很大,f 很小,対階時(shí)f 看齊d,尾數(shù)可能一直右移導(dǎo)致有效位沒有了變成了全0,再進(jìn)行尾數(shù)加減時(shí) d 值不變。所以左邊等于0,右邊等于 f,兩者不等。
浮點(diǎn)數(shù)乘法運(yùn)算過程類似加減法,主要區(qū)別在于乘除法不用対階,其他過程基本一樣。也好理解,就像我們平時(shí)用科學(xué)計(jì)數(shù)法做算數(shù)時(shí),加減法那肯定是需要指數(shù)相等,尾數(shù)才能相加減;而乘除法時(shí)可以直接尾數(shù)與尾數(shù)運(yùn)算,指數(shù)與指數(shù)運(yùn)算,一個(gè)道理。
感謝各位的閱讀,以上就是“計(jì)算機(jī)的數(shù)值問題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)計(jì)算機(jī)的數(shù)值問題有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前名稱:計(jì)算機(jī)的數(shù)值問題有哪些
URL分享:http://www.rwnh.cn/article48/ippiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、小程序開發(fā)、搜索引擎優(yōu)化、網(wǎng)站改版、定制開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)