浮點運算

浮點運算

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

  • 中文名稱
    浮點運算
  • 性質
    實數運算
  • 原因
    電腦隻能存儲整數
  • 特點
    實數都是約數

簡介

浮點運算就是實數運算。浮點運算是高精度的運算方式,主要運用在科學和多媒體中。可以理解為小數點可移動的運算方式。

數和計算通常是按“整數”或“浮點數”進行劃分的。整數計算使用計算的所有位記錄整數“值”。而浮點計算則使用計算的一部分位表示“值”,另一部分位表示指數。由于一部分位用來表示指數,所以浮點計算得出的值可以比整數計算得出的值大很多或是小很多。換句話說,對于給定數量的位,浮點計算的精度沒有整數計算高,但浮點計算結果的範圍卻比整數計算大很多。

計算精度

採用浮點計算時,可以確定記錄多少個數。例如,“π”的一個相當長的表示是3.14159265358979323846264338327950288419716939937510。問題是您想/需要記錄π的幾位數和想讓精確度達到多少。

π的上述值是51位數。要將51位數表示成二進位數,每位數需要3.32位,總計需要51*3.32=169位。這樣位數太多。您使用的位數越多,處理器計算的復雜程度就越高,也就需要更多的記憶體來存儲值,計算所用的時間也就越長。由于各計算所需精度不同,因此處理器為不同指令提供不同的精度,從而使編程人員可以確定他們所需的精度。精度級別可分為:單精度、雙精度和擴展精度。

運算資料

FPU->Floating Point Unit,浮點運算部件

BCD->Binary Coded Decimal 壓縮的二十進位數,是用4個位來表示數位0~9,一個byte表示兩個十進位數,比如01111001表示89

浮點運算使用三種不同的資料:

1、整數(Integer),又分為字,短整數(Short Integer)和長整數(Long Integer)

2、實數(Real)分單精度(Single Real)和雙精度(Double Real)

3、壓縮的二十進位數(BCD)

部件

FPU從功能上分為兩個部分:控製單元和運算單元,控製單元主要面向CPU,而算數單元負責具體算數運算.

FPU即浮點部件包括8個通用暫存器,5個錯誤指針暫存器和三個控製暫存器

1、8個通用暫存器每個80 bit,形成一個暫存器堆疊,所有的計算結果都儲存在暫存器堆疊中,其中資料全部是80位的擴展精度格式,即使是BCD,整數,單精度和雙精度等在裝入暫存器的時候都要被FPU自動轉化為80位的擴展精度格式,註意堆頂通常表示為ST(0),然後是ST(1)...ST(i),ST(i)是相對于堆頂而言的.

和堆疊很相似,隻不過寬度為80bit,映像如下:

_______________________

| ST(0) |

|_______________________|

| ST(1) |

|_______________________|

| ...... |

| ...... |

| ST(i) |

|_______________________|

2、控製暫存器,FPU有三個控製暫存器:狀態暫存器,控製暫存器和標記暫存器

狀態暫存器->SW

_M_____D________10___9____8___7_________5_________________________0__

| B | C3| TOP| C2 | C1 | C0 | ES | | PE | UE | OE | ZE | DE | IE |

|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

B: 浮點部件正忙

C0-C3 指示浮點運算的結果,不同指令有不同含義

TOP 指示堆頂,通常是0

ES 以下任何位置位 (pe,ue,oe,ze,de,or ie) 則置位

PE 精度故障

UE 數位太小無法表示溢出

OE 現有精度無法表示,數位太大溢出

ZE 除0錯

DE 指示至少有一個運算元未規格化

IE 無效錯誤,指示堆疊上溢或下溢,無效運算元

控製暫存器

_15____________10___9____8___7_________5______________________0__

| |IC | RC | PC | | PM | UM | OM | ZM | DM | IM |

|____|____|____|___|__|_|__|__|____|____|____|____|____|____|____|

IC 無窮大控製,對486,已經無效

RC 舍入控製

00 = 朝最接近或者偶數舍入

01 = 朝負無窮大方向舍入

10 = 朝正無窮大方向舍入

11 = 超0方向截斷

PC 精度控製

00 = 單精度

01 = 保留

10 = 雙精度

11 = 擴展精度

PM~IM 禁止狀態暫存器低5位指示的錯誤.為1則禁止.

標記暫存器

每2 bit表示一個對應堆疊暫存器的狀態,具體含義如下:

15________________________________________3_____0

|Tag7 |...................................|tag1|

|_____|___________________________________|____|

含義:

00 = 有效

01 = 零

10 = 無效或無窮大

11 = 為空

浮點數

在這之前,先來看幾個術語:

FPU->Floating Point Unit,浮點運算部件

BCD->Binary Coded Decimal 壓縮的二十進位數,是用4個位來表示數位0~9,一個byte表示兩個十進位數,比如01111001表示89

浮點運算使用三種不同的資料:

1、整數(Integer),又分為字,短整數(Short Integer)和長整數(Long Integer)

2、實數(Real)分單精度(Single Real)和雙精度(Double Real)

3、壓縮的二十進位數(BCD)

​格式

單精度:_31_30________23_22___________0

符號 指數 有效數

雙精度:_63_62__________52_51__________________0

符號 指數 有效數

擴展精度數: _79_78____________64_63___________________0

符號 指數 有效數

例子:

C377999A var1 dd -247.6

40000000 var2 dd 2.0

486F4200 var3 real4 2.45e+5

4059100000000000 var4 dq 100.25

3F543BF727136A40 var5 real8 0.00123

C377999A var1 dd -247.6

40000000 var2 dd 2.0

486F4200 var3 real4 2.45e+5

4059100000000000 var4 dq 100.25

3F543BF727136A40 var5 real8 0.001235

400487F34D6A161E4F76 var6 real10 33.9876

DD和real4都可以在asm中來定義單精度浮點數,4 bytes

DQ和real8都可以在asm中來定義雙精度浮點數,8 bytes

DT和real10都可以在asm中來定義擴展精度浮點數,10 bytes

​指令系統分類

浮點指令系統分為五類:資料傳送類、算術運算類、超越函式類、比較類、環境及系統控製類.

我並不想列出所有函式的參數以及用法,具體參考資料見文章最後.

1、資料傳送

這類指令主要是從記憶體裝入浮點暫存器堆資料,一般目的地址總是堆頂ST(0),用調試器你可以清楚地看到這一點.註意帶P結尾的操作,是在前面操作完成之後出堆,也就是原來ST(1)的內容現在成了ST(0)的內容,註意到這一點,你可以方便地設計出靈活多變的程式.

裝入:

FLD Push real onto stack

FILD Convert two's complement integer to real and push

FBLD Convert BCD to real and push to stack

存儲:

FST Store floating-point number from stack

FSTP Convert top of stack to integer

FIST

FISTP Convert top of stack to integer

FBSTP Store BCD to integer and pop stack

交換:

FXCH Exchange top two stack elements

常數裝載:

FLD1 裝入常數1.0

FLDZ 裝入常數0.0

FLDPI 裝入常數pi (=3.1415926....精度足夠,放心使用)

FLDL2E 裝入常數log(2)e

FLDL2T 裝入常數log(2)10

FLDLG2 裝入常數log(10)2

FLDLN2 裝入常數Log(e)2

2、算術運算類

加法:

FADD/FADDP Add/add and pop

FIADD Integer add

減法:

FSUB/FSUBP Subtract/subtract and pop

FSUBR/FSUBRP Subtract/subtract and pop with reversed operands

FISUB Integer subtract

FISUBR Integer subtract/subtract with reversed operands

乘法:

FMUL/FMULP Multiply/multiply and pop

FIMUL Integer multiply

除法:

FDIV/FDIVP Divide/divide and pop

FIDIV Integer divide

FDIVR/FDIVRP Divide/divide and pop with reversed operands

FIDIVR integer divide with reversed operands

其他:

FABS Calculate absolute value

FCHS Change sign

FRNDINT Round to integer

FSQRT Calculate square root

FSCALE Scale top of stack by power of 2

FXTRACT Separate exponent and mantissa

FPREM Calculate partial remainder

FPREM1 Calculate partial remainder in IEEE format

如果指令後面未帶運算元,其默認的運算元為ST(0)和ST(1),關于帶R尾碼的指令是正常運算元的順序變反,比如fsub執行的是x-y,fsubr執行的就是y-x.

3、超越函式

三角函式

FSIN Calculate sine

FCOS Calculate cosine

FSINCOS Calculate quick sine and cosine

FPTAN Calculate partial tangent

FPATAN Calculate partial arctangent

Log類

FYL2X Calculate y times log base 2 of x

FYL2XP1 Calculate y times log base 2 of (x+1)

F2XM1 Calculate (2^x)-1

4、比較類

FCOM Compare

FCOMP Compare and pop

FICOM Integer compare

FTST Integer compare and pop

FUCOM Unordered compare

FUCOMP Unordered compare and pop

FXAM Set condition code bits for value at top of stack

FSTSW Store status word

會根據結果設定,C0~C3,在上面並未就C0~C3進行具體介紹,C1是用來判斷上溢或者下溢的,C0相當于EFLAGS裏面的CF,作用也基本一致,C2相當于PF,C3相當于ZF,可能會看到如下指令

FSTSW ax

SAHF

JZ label

為什麽如此呢,因為用如上指令將狀態字存入EFLAGS,C0正好置于CF位,C3正好置于ZF位.

5、環境及系統控製類

FLDCW Load control word

FSTCW Store control word

FSTSW Store status word

FLDENV Load environment block

FSTENV Store environment block

FSAVE Save coprocessor state

FRSTOR Restore coprocessor state

FINIT Initialize coprocessor

FCLEX Clear exception flags

FINCSTP Increment stack pointer

FDECSTP Decrement stack pointer

FFREE Mark element as free

FNOP No operation

FWAIT Wait until floating-point instruction complete

相關詞條

其它詞條