日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浮点数在计算机中是如何表示的

發(fā)布時(shí)間:2025/3/14 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浮点数在计算机中是如何表示的 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
眾所周知,計(jì)算機(jī)中的所有數(shù)據(jù)都是以二進(jìn)制表示的,浮點(diǎn)數(shù)也不例外。然而浮點(diǎn)數(shù)的二進(jìn)制表示法卻不像定點(diǎn)數(shù)那么簡單了。
先澄清一個(gè)概念,浮點(diǎn)數(shù)并不一定等于小數(shù),定點(diǎn)數(shù)也并不一定就是整數(shù)。所謂浮點(diǎn)數(shù)就是小數(shù)點(diǎn)在邏輯上是不固定的,而定點(diǎn)數(shù)只能表示小數(shù)點(diǎn)固定的數(shù)值,具用浮點(diǎn)數(shù)或定點(diǎn)數(shù)表示某哪一種數(shù)要看用戶賦予了這個(gè)數(shù)的意義是什么。
C++中的浮點(diǎn)數(shù)有6種,分別是:
float:單精度,32位
unsigned float:單精度無符號,32位
double:雙精度,64位
unsigned double:雙精度無符號,64位
long double:高雙精度,80位
unsigned long double:高雙精度無符號,80位(嚯,應(yīng)該是C++中最長的內(nèi)置類型了吧!)
然而不同的編譯器對它們的支持也略有不同,據(jù)我所知,很多編譯器都沒有按照IEEE規(guī)定的標(biāo)準(zhǔn)80位支持后兩種浮點(diǎn)數(shù)的,大多數(shù)編譯器將它們視為double,或許還有極個(gè)別的編譯器將它們視為128位?!對于128位的long double我也僅是聽說過,沒有求證,哪位高人知道這一細(xì)節(jié)煩勞告知。
下面我僅以float(帶符號,單精度,32位)類型的浮點(diǎn)數(shù)說明C++中的浮點(diǎn)數(shù)是如何在內(nèi)存中表示的。先講一下基礎(chǔ)知識,純小數(shù)的二進(jìn)制表示。(純小數(shù)就是沒有整數(shù)部分的小數(shù),講給小學(xué)沒好好學(xué)的人)
純小數(shù)要想用二進(jìn)制表示,必須先進(jìn)行規(guī)格化,即化為 1.xxxxx * ( 2 ^ n ) 的形式(“^”代表乘方,2 ^ n表示2的n次方)。對于一個(gè)純小數(shù)D,求n的公式如下:
n = 1 + log2(D);// 純小數(shù)求得的n必為負(fù)數(shù)
再用 D / ( 2 ^ n ) 就可以得到規(guī)格化后的小數(shù)了。接下來就是十進(jìn)制到二進(jìn)制的轉(zhuǎn)化問題,為了更好的理解,先來看一下10進(jìn)制的純小數(shù)是怎么表示的,假設(shè)有純小數(shù)D,它小數(shù)點(diǎn)后的每一位數(shù)字按順序形成一個(gè)集合:
{k1, k2, k3, ... , kn}
那么D又可以這樣表示:
D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ... + kn / (10 ^ n )
推廣到二進(jìn)制中,純小數(shù)的表示法即為:
D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n )
現(xiàn)在問題就是怎樣求得b1, b2, b3,……,bn。算法描述起來比較復(fù)雜,還是用數(shù)字來說話吧。聲明一下,1 / ( 2 ^ n )這個(gè)數(shù)比較特殊,我稱之為位階值。
例如0.456,第1位,0.456小于位階值0.5故為0;第2位,0.456大于位階值0.25,該位為1,并將0.45減去0.25得0.206進(jìn)下一位;第3位,0.206大于位階值0.125,該位為1,并將0.206減去0.125得0.081進(jìn)下一位;第4位,0.081大于0.0625,為1,并將0.081減去0.0625得0.0185進(jìn)下一位;第5位0.0185小于0.03125……
最后把計(jì)算得到的足夠多的1和0按位順序組合起來,就得到了一個(gè)比較精確的用二進(jìn)制表示的純小數(shù)了,同時(shí)精度問題也就由此產(chǎn)生,許多數(shù)都是無法在有限的n內(nèi)完全精確的表示出來的,我們只能利用更大的n值來更精確的表示這個(gè)數(shù),這就是為什么在許多領(lǐng)域,程序員都更喜歡用double而不是float。
float的內(nèi)存結(jié)構(gòu),我用一個(gè)帶位域的結(jié)構(gòu)體描述如下:
struct MYFLOAT
{
bool bSign : 1; // 符號,表示正負(fù),1位
char cExponent : 8; // 指數(shù),8位
unsigned long ulMantissa : 23; // 尾數(shù),23位
};
符號就不用多說了,1表示負(fù),0表示正
指數(shù)是以2為底的,范圍是 -128 到 127,實(shí)際數(shù)據(jù)中的指數(shù)是原始指數(shù)加上127得到的,如果超過了127,則從-128開始計(jì),其行為和X86架構(gòu)的CPU處理加減法的溢出是一樣的。比如:127 + 2 = -127;127 - 2 = 127
尾數(shù)都省去了第1位的1,所以在還原時(shí)要先在第一位加上1。它可能包含整數(shù)和純小數(shù)兩部分,也可能只包含其中一部分,視數(shù)字大小而定。對于帶有整數(shù)部分的浮點(diǎn)數(shù),其整數(shù)的表示法有兩種,當(dāng)整數(shù)大于十進(jìn)制的16777215時(shí)使用的是科學(xué)計(jì)數(shù)法,如果小于或等于則直接采用一般的二進(jìn)制表示法。科學(xué)計(jì)數(shù)法和小數(shù)的表示法是一樣的。
小數(shù)部分則是直接使用科學(xué)計(jì)數(shù)法,但形式不是X * ( 10 ^ n ),而是X * ( 2 ^ n )。拆開來看。
0000000000000000000000000000000
符號位指數(shù)位尾數(shù)位

轉(zhuǎn)載于:https://www.cnblogs.com/vam/archive/2007/09/26/906535.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的浮点数在计算机中是如何表示的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。