當前位置:首頁 » 編程軟體 » 編譯器浮點計算公式

編譯器浮點計算公式

發布時間: 2022-11-19 18:20:09

① 二進制中浮點數怎麼表示

目前C/C++編譯器標准都遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。下面是具體的規格:
符號位 階碼 尾數 長度
float 1 8 23 32
double 1 11 52 64 以下通過幾個例子講解浮點數如何轉換為二進制數例一:已知:double類型38414.4。求:其對應的二進製表示。分析:double類型共計64位,摺合8位元組。由最高到最低位分別是第63、62、61、……、0位:
最高位63位是符號位,1表示該數為負,0表示該數為正;
62-52位,一共11位是指數位;
51-0位,一共52位是尾數位。

步驟:按照IEEE浮點數表示法,下面先把38414.4轉換為十六進制數。
把整數部和小數部分開處理:整數部直接化十六進制:960E。小數的處理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
實際上這永遠算不完!這就是著名的浮點數精度問題。所以直到加上前面的整數部分算夠53位就行了。隱藏位技術:最高位的1不寫入內存(最終保留下來的還是52位)。
如果你夠耐心,手工算到53位那麼因該是:38414.4(10)=1001011000001110.(2)科學記數法為:1.001011000001110 ,右移了15位,所以指數為15。或者可以如下理解:1.001011000001110 ×2^15
於是來看階碼,按IEEE標准一共11位,可以表示範圍是-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023(2^10-1),在這里,階碼:15+1023=1038。二進製表示為:100 00001110;
符號位:因為38414.4為正對應 為0;
合在一起(註:尾數二進制最高位的1不要):
01000000 11100010 11000001 110 01100 11001100 11001100 11001100 11001100 例二:已知:整數3490593(16進製表示為0x354321)。求:其對應的浮點數3490593.0的二進製表示。 解法如下:先求出整數3490593的二進製表示: H: 3 5 4 3 2 1 (十六進製表示) B: 0011 0101 0100 0011 0010 0001 (二進製表示) │←──────21─────→│ 即: 1.1010101000011001000012×221可見,從左算起第一個1後有21位,我們將這21為作為浮點數的小數表示,單精度浮點數float由符號位1位,指數域位k=8位,小數域位(尾數)n=23位構成,因此對上面得到的21位小數位我們還需要補上2個0,得到浮點數的小數域表示為: 1 0101 0100 0011 0010 0001 00 float類型的偏置量Bias=2k-1-1=28-1-1=127,但還要補上剛才因為右移作為小數部分的21位,因此偏置量為127+21=148,就是IEEE浮點數表示標准: V = (-1)s×M×2E E = e-Bias中的e,此前計算Bias=127,剛好驗證了E=148-127=21。 將148轉為二進製表示為10010100,加上符號位0,最後得到二進制浮點數表示,其16進製表示為: H: 4 A 5 5 0 C 8 4 B: 0100 1010 0101 0101 0000 1100 1000 0100 |←──── 21 ─────→ | 1|←─8 ─→||←───── 23 ─────→ | 這就是浮點數3490593.0(0x4A550C84)的二進製表示。 例三:0.5的二進制形式是0.1它用浮點數的形式寫出來是如下格式 0 01111110 00000000000000000000000
符號位 階碼 小數位正數符號位為0,負數符號位為1階碼是以2為底的指數小數位表示小數點後面的數字
下面我們來分析一下0.5是如何寫成0 01111110 00000000000000000000000
首先0.5是正數所以符號位為0再來看階碼部分,0.5的二進制數是0.1,而0.1是1.0*2^(-1),所以我們總結出來:要把二進制數變成(1.f)*2^(exponent)的形式,其中exponent是指數而由於階碼有正負之分所以階碼=127+exponent;即階碼=127+(-1)=126 即 01111110餘下的小數位為二進制小數點後面的數字,即00000000000000000000000
由以上分析得0.5的浮點數存儲形式為0 01111110 00000000000000000000000 註:如果只有小數部分,那麼需要右移小數點. 比如右移3位才能放到第一個1的後面, 階碼就是127-3=124.例四 (20.59375)10 =(10100.10011 )2

首先分別將整數和分數部分轉換成二進制數:

20.59375=10100.10011

然後移動小數點,使其在第1,2位之間

10100.10011=1.010010011×2^4 即e=4

於是得到:

S=0, E=4+127=131, M=010010011

最後得到32位浮點數的二進制存儲格式為:

0100 1001 1010 0100 1100 0000 0000 0000=(41A4C000)16 例五:
-12.5轉為單精度二進製表示
12.5:
1. 整數部分12,二進制為1100; 小數部分0.5, 二進制是.1,先把他們連起來,從第一個1數起取24位(後面補0):
1100.10000000000000000000
這部分是有效數字。(把小數點前後兩部分連起來再取掉頭前的1,就是尾數)
2. 把小數點移到第一個1的後面,需要左移3位(1.10010000000000000000000*2^3), 加上偏移量127:127+3=130,二進制是10000010,這是階碼。
3. -12.5是負數,所以符號位是1。把符號位,階碼和尾數連起來。注意,尾數的第一位總是1,所以規定不存這一位的1,只取後23位:
1 10000010 10010000000000000000000
把這32位按8位一節整理一下,得:
11000001 01001000 00000000 00000000
就是十六進制的 C1480000.

例六:2.025675
1. 整數部分2,二進制為10; 小數部分0.025675, 二進制是.0000011010010010101001,先把他們連起來,從第一個1數起取24位(後面補0):
10.0000011010010010101001
這部分是有效數字。把小數點前後兩部分連起來再取掉頭前的1,就是尾數: 00000011010010010101001
2. 把小數點移到第一個1的後面,左移了1位, 加上偏移量127:127+1=128,二進制是10000000,這是階碼。
3. 2.025675是正數,所以符號位是0。把符號位,階碼和尾數連起來:
0 10000000 00000011010010010101001
把這32位按8位一節整理一下,得:
01000000 00000001 10100100 10101001
就是十六進制的 4001A4A9.

例七:
(逆向求十進制整數)一個浮點二進制數手工轉換成十進制數的例子:
假設浮點二進制數是 1011 1101 0100 0000 0000 0000 0000 0000
按1,8,23位分成三段:
1 01111010 10000000000000000000000
最後一段是尾數。前面加上"1.", 就是 1.10000000000000000000000
下面確定小數點位置。由E = e-Bias,階碼E是01111010,加上00000101才是01111111(127),
所以他減去127的偏移量得e=-5。(或者化成十進製得122,122-127=-5)。
因此尾數1.10(後面的0不寫了)是小數點右移5位的結果。要復原它就要左移5位小數點,得0.0000110, 即十進制的0.046875 。
最後是符號:1代表負數,所以最後的結果是 -0.046875 。

注意:其他機器的浮點數表示方法可能與此不同. 不能任意移植。 再看一例(類似例七):比如:53004d3e二進製表示為:按照1個符號 8個指數 23個小數位劃分0 10100110 00000000100110100111110正確的結果轉出來應該是551051722752.0該怎麼算?好,我們根據IEEE的浮點數表示規則劃分,得到這個浮點數的小數位是:

00000000100110100111110

那麼它的二進製表示就應該是:

1.000000001001101001111102 × 239

這是怎麼來的呢? 別急,聽我慢慢道來。
標准化公式中的M要求在規格化的情況下,取值范圍1<M<(2-ε)正因為如此,我們才需要對原始的整數二進製表示做偏移,偏移多少呢?偏移2E。
這個「E」怎麼算?上面的239怎麼得來的呢?浮點數表示中的8位指數為就是告訴這個的。我們知道:
E = e-Bias
那麼根據指數位:101001102=>16610
即e=166,由此算出E=e-Bias=166-127=39,就是說將整數二進製表示轉為標準的浮點數二進製表示的時候需要將小數點左移39位,好,我們現在把它還原得到整數的二進製表示:1 00000000100110100111110 00000000000000001│←───── 23─────→│←─── 16───→│

23+16=39,後面接著就是小數點了。
拿出計算器,輸入二進制數
轉為十進制數,不正是:551051722752么!

通過這例六例七,介紹了將整數二進製表示轉浮點數二進製表示的逆過程,還是希望大家不但能掌握轉化的方法,更要理解轉化的基本原理。

② 32位浮點數計算

編程嘛!
用C語言的union
union Para
{
float t;
unsigned char buf[4];
}
如果Para.t=100.0008;
則Para.buf[0]=0x42;
Para.buf[1]=0xC8;
Para.buf[2]=0x00;
Para.buf[3]=0x69;

如果要計算原理的話,請參考:
http://www.psc.e/general/software/packages/ieee/ieee.php

③ 浮點數在計算機中是如何表示的

浮點數浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學記數法。
浮點計算是指浮點數參與的運算,這種運算通常伴隨著因為無法精確表示而進行的近似或舍入。
一個浮點數a由兩個數m和e來表示:a = m × b^e。在任意一個這樣的系統中,我們選擇一個基數b(記數系統的基)和精度p(即使用多少位來存儲)。m(即尾數)是形如±d.ddd...ddd的p位數(每一位是一個介於0到b-1之間的整數,包括0和b-1)。如果m的第一位是非0整數,m稱作規格化的。有一些描述使用一個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。
由此可以看出,在計算機中表示一個浮點數,其結構如下:
尾數部分(定點小數) 階碼部分(定點整數)數符±尾數m階符±階碼e
這種設計可以在某個固定長度的存儲空間內表示定點數無法表示的更大范圍的數。
例如,一個指數范圍為±4的4位十進制浮點數可以用來表示43210,4.321或0.0004321,但是沒有足夠的精度來表示432.123和43212.3(必須近似為432.1和43210)。當然,實際使用的位數通常遠大於4。
此外,浮點數表示法通常還包括一些特別的數值:+∞和�6�1∞(正負無窮大)以及NaN('Not a Number')。無窮大用於數太大而無法表示的時候,NaN則指示非法操作或者無法定義的結果。
眾所周知,計算機中的所有數據都是以二進製表示的,浮點數也不例外。然而浮點數的二進製表示法卻不像定點數那麼簡單了。
先澄清一個概念,浮點數並不一定等於小數,定點數也並不一定就是整數。所謂浮點數就是小數點在邏輯上是不固定的,而定點數只能表示小數點固定的數值,具用浮點數或定點數表示某哪一種數要看用戶賦予了這個數的意義是什麼。
C++中的浮點數有6種,分別是:
float:單精度,32位
unsigned float:單精度無符號,32位
double:雙精度,64位
unsigned double:雙精度無符號,64位
long double:高雙精度,80位
unsigned long double:高雙精度無符號,80位(嚯,應該是C++中最長的內置類型了吧!)
然而不同的編譯器對它們的支持也略有不同,據我所知,很多編譯器都沒有按照IEEE規定的標准80位支持後兩種浮點數的,大多數編譯器將它們視為double,或許還有極個別的編譯器將它們視為128位?!對於128位的long double我也僅是聽說過,沒有求證,哪位高人知道這一細節煩勞告知。
下面我僅以float(帶符號,單精度,32位)類型的浮點數說明C++中的浮點數是如何在內存中表示的。先講一下基礎知識,純小數的二進製表示。(純小數就是沒有整數部分的小數,講給小學沒好好學的人)
純小數要想用二進製表示,必須先進行規格化,即化為 1.xxxxx * ( 2 ^ n ) 的形式(「^」代表乘方,2 ^ n表示2的n次方)。對於一個純小數D,求n的公式如下:
n = 1 + log2(D); // 純小數求得的n必為負數
再用 D / ( 2 ^ n ) 就可以得到規格化後的小數了。接下來就是十進制到二進制的轉化問題,為了更好的理解,先來看一下10進制的純小數是怎麼表示的,假設有純小數D,它小數點後的每一位數字按順序形成一個數列:
{k1, k2, k3, ... , kn}
那麼D又可以這樣表示:
D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ... + kn / (10 ^ n )
推廣到二進制中,純小數的表示法即為:
D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n )
現在問題就是怎樣求得b1, b2, b3,……,bn。演算法描述起來比較復雜,還是用數字來說話吧。聲明一下,1 / ( 2 ^ n )這個數比較特殊,我稱之為位階值。
例如0.456,第1位,0.456小於位階值0.5故為0;第2位,0.456大於位階值0.25,該位為1,並將0.45減去0.25得0.206進下一位;第3位,0.206大於位階值0.125,該位為1,並將0.206減去0.125得0.081進下一位;第4位,0.081大於0.0625,為1,並將0.081減去0.0625得0.0185進下一位;第5位0.0185小於0.03125……
最後把計算得到的足夠多的1和0按位順序組合起來,就得到了一個比較精確的用二進製表示的純小數了,同時精度問題也就由此產生,許多數都是無法在有限的n內完全精確的表示出來的,我們只能利用更大的n值來更精確的表示這個數,這就是為什麼在許多領域,程序員都更喜歡用double而不是float。
float的內存結構,我用一個帶位域的結構體描述如下:
struct MYFLOAT
{
bool bSign : 1; // 符號,表示正負,1位
char cExponent : 8; // 指數,8位
unsigned long ulMantissa : 23; // 尾數,23位
};
符號就不用多說了,1表示負,0表示正
指數是以2為底的,范圍是 -128 到 127,實際數據中的指數是原始指數加上127得到的,如果超過了127,則從-128開始計,其行為和X86架構的CPU處理加減法的溢出是一樣的。
比如:127 + 2 = -127;-127 - 2 = 127
尾數都省去了第1位的1,所以在還原時要先在第一位加上1。它可能包含整數和純小數兩部分,也可能只包含其中一部分,視數字大小而定。對於帶有整數部分的浮點數,其整數的表示法有兩種,當整數大於十進制的16777215時使用的是科學計數法,如果小於或等於則直接採用一般的二進製表示法。科學計數法和小數的表示法是一樣的。
小數部分則是直接使用科學計數法,但形式不是X * ( 10 ^ n ),而是X * ( 2 ^ n )。拆開來看。
0 00000000 0000000000000000000000
符號位 指數位 尾數位

④ 單精度的浮點數有效數字為什麼是七位如何計算為什麼謝謝啦

浮點數7位有效數字.
雙精度數16位有效數字.
浮點數取值范圍:
負數取值范圍為 -3.4028235E+38 到 -1.401298E-45,正數取值范圍為 1.401298E-45 到 3.4028235E+38.
雙精度數取值范圍:
負值取值范圍-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范圍為 4.94065645841246544E-324 到 1.79769313486231570E+308.
C/C++中浮點數的表示遵循IEEE 754標准.
一個浮點數由三部分組成:符號位S、指數部分E(階碼)以及尾數部分M(如下).
Floating
S--------E-------M
1位-----8位-----23位
Double
S--------E-------M
1位-----11位----52位
十進制數的換算計算公式為(n^m表示n的m次冪,B表示前面的數字是二進制):
S * 2^(E-127) * (1.M)B
浮點數的精度取決於尾數部分.尾數部分的位數越多,能夠表示的有效數字越多.
單精度數的尾數用23位存儲,加上默認的小數點前的1位1,2^(23+1) = 16777216.因為 10^7 < 16777216 < 10^8,所以說單精度浮點數的有效位數是7位.
雙精度的尾數用52位存儲,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以雙精度的有效位數是16位.
另外:
如果你在PI值的有效位後增加數字的話,結果是不會變化的,由於PI值是以常數方式賦值,可以在常數後面加個'f',如PI = 3.1415926f;否則編譯器會先把常數當作double類型,然後再截斷後面的值變為浮點值,這樣的話,就有可能PI的值會有不同,造成你看到的現象.

⑤ 誰能告訴我一下伺服器cpu浮點運算的計算公式是什麼

處理器的浮點運算:
浮點運算就是實數運算。

因為計算機只能存儲整數,所以實數都是約數,這樣浮點運算是很慢的而且會有誤差。現在大多數機器都是32位的,也就是說64位都用來表示整數的話,那麼對於無符號整數就是0 到 2^32-1,對於有符號的話就是-2^31 到 2^31-1。

計算機里整數和小數形式就是按普通格式進行存儲,例如1024、3.1415926等等,這個沒什麼特點,但是這樣的數精度不高,表達也不夠全面,為了能夠有一種數的通用表示法,就發明了浮點數。
浮點數的表示形式有點像科學計數法(*.*****×10^***),它的表示形式是0.*****×10^***,在計算機中的形式為 .***** e ±***),其中前面的星號代表定點小數,也就是整數部分為0的純小數,後面的指數部分是定點整數。利用這樣的形式就能表示出任意一個整數和小數,例如1024就能表示成0.1024×10^4,也就是 .1024e+004,3.1415926就能表示成0.31415926×10^1,也就是 .31415926e+001,這就是浮點數。浮點數進行的運算就是浮點運算。

浮點運算比常規運算更復雜,因此計算機進行浮點運算速度要比進行常規運算慢得多。

⑥ 浮點數表示方法是什麼

是已知的C/C++編譯器都是按照IEEE(國際電子電器工程師協會)制定的IEEE浮點數表示法來進行運算的。這種結構是一種科學表示法,用符號(+或-)、指數和尾數來表示,底數被確定為2。所以在IEEE浮點數表示法里,一個浮點數為尾數乘以2的指數次方再加上符號。

(6)編譯器浮點計算公式擴展閱讀:

格式

()

其中Ef到E7這部分叫做階碼,用移碼表示,Ef是階符,Mf到M7稱作尾數,用補碼表示,Mf為數符,小數點的位置在Mf後面對於浮點數的表示,字長是由硬體決定,如字長可以是32位,其中階碼8位,含一位階符,則階碼的表示範圍為-128到127,尾數為23位。

例如,原數為-1101.110101000100...0如果用上述32位表示,-1101.110101000100...0=-0.1101110101000100...0*2^4,4=0000100,其移碼=2^7+0000100=10000100

Mf為1,M1後為1101110101000100...,不足23位後的空位置用0補夠,則其浮點數表示為10000100,1.1101110101000100...0。

java的double類型的浮點運算(要解釋的)。

double f=0.0005;
double i=3;
double d=f*i;
double f1=0.0005;
double j=3;
double d1=f1*j;
if(d==d1){
System.out.println("aaa");
}這樣就相當,java中基本數據類型稱為自動變數,自動變數存的是字面值,由於字面值的數據大小可知,生存期可知,出於速度的原因就把它們放在棧中,棧中的數據可以共享.如int a=3 int b=3 編譯器先處理int a=3;首先它會在棧中創建一個變數為a的引用,然後在找字面值等於3的地址,沒有 就開辟一個存放3這個字面值的地址,接著處理int b=3;在創建完變數為b的應用後,查找有沒有3這個字面值的地址,現在有了,則指向3的地址,這時用==(判斷地址是否相同時)就會為True

⑧ 浮點數怎麼計算要詳細過程··

一個浮點數a由兩個數m和e來表示:a = m × b^e。

在任意一個這樣的系統中,我們選擇一個基數b(記數系統的基)和精度p(即使用多少位來存儲)。m(即尾數)是形如±d.ddd...ddd的p位數(每一位是一個介於0到b-1之間的整數,包括0和b-1)。如果m的第一位是非0整數,m稱作規格化的。

有一些描述使用一個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。

例如,一個指數范圍為±4的4位十進制浮點數可以用來表示43210,4.321或0.0004321,但是沒有足夠的精度來表示432.123和43212.3(必須近似為432.1和43210)。當然,實際使用的位數通常遠大於4。

(8)編譯器浮點計算公式擴展閱讀:

浮點數並不一定等於小數,定點數也並不一定就是整數。

C++中的浮點數有6種,分別是:

float:單精度,32位

unsigned float:單精度無符號,32位

double:雙精度,64位

long double:高雙精度,80位

純小數要想用二進製表示,必須先進行規格化,即化為 1.xxxxx * ( 2 ^ n ) 的形式(「^」代表乘方,2 ^ n表示2的n次方)。對於一個純小數D,求n的公式如下:

n = 1 + log2(D); // 純小數求得的n必為負數

再用 D / ( 2 ^ n ) 就可以得到規格化後的小數了。接下來就是十進制到二進制的轉化問題,為了更好的理解,先來看一下10進制的純小數是怎麼表示的,假設有純小數D,它小數點後的每一位數字按順序形成一個數列:

{k1,k2,k3,...,kn}

那麼D又可以這樣表示:

D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ... + kn / (10 ^ n )

推廣到二進制中,純小數的表示法即為:

D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ... + bn / (2 ^ n )

⑨ 計算機組成原理——浮點數表示方法

就是在二進制中,一個數的小數點可以可以通過乘以2的冪次來改變位置,這是其原理 。

浮點數的組成:階符+ 階碼 +數符+ 尾數

計算機中表示浮點數的字長通常為32位,其中7位作階碼,1位為階符,23位尾數,1位作數符

例如用2個位元組表示一個浮點數(32寫起來麻煩,所以用2個位元組就是16位來舉例,呵呵希望諒解) (72.45x10^5)D先換成普通二進制數(11011101000110011001000)B

然後開始像十進制數的科學計數法那樣寫成約等於(0.1101110)Bx(2^23)D

之後再將後半部分的(2^23)D轉換成(2^10111)B

於是整個數就變成了(0.1101110x2^10111)B

在計算機中表示成0001011101101110 其中第一個0是階符表示指數是正的第九個0表示尾數是正的他們中間的就是階碼,後面的就是尾數。

⑩ 計算機原理 浮點數的那個公式 我沒明白他是怎麼把一個二進制數轉換成這種格式的比如說100

我給你舉個例子吧,假設在一個16位的機器上,約定浮點數的格式為:1位階符+6位階碼+1位數符+8位尾數,那麼 1010 0011 0110 0011就代表著:
最高位(階符)為1,代表階數為負數;
6位階碼為010001,也就是階碼的絕對值為17;
數符為1,代表這個浮點數本身是負數;
尾數為0110 0011,一般代表著這個浮點數的二進制形式為1.0110 0011,也就是1.38671875。
所以這個浮點數就是-1.38671875乘以2的-17次方。(注意,前提是浮點數的格式按照開頭的假設。實際生活中的浮點數格式很少有這樣的)

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:166
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:737
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:149
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:544
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:366