在定點機上進行浮點數運算,有二種方法一種是硬件方法一附加浮點數運算器;另一種是軟件方法,即編製浮點數運算程序。
在定點機上進行浮點數運算,一般情況下是用一位(最高位)表示數的符號根據使用者要求的精度,用若幹位表示階碼,其中有一位是階符;用若幹位表示尾數,作了這些規定之後,就可以編程運算了。
浮點數四則運算大致分成這幾個步驟:
①運算數規格化;②符號處理;③階碼處理;④尾數處理求結果尾數;⑤對結果進行規格化處理等,下麵分別說明。
4.3-2 浮點數四則運算程序
一、浮點加法子程序
1.浮點數加法運算
兩個浮點數相加,同樣要分幾個步驟進行。首先對階,其次進行符號處理。即把數值較大者的符號作為和數的符號,然後再把尾數相加。最後,把所得結果規格化。
關於符號處理,我們先檢查兩個數的符號是否相同。若相同,就可以將兩個尾數相加。尾數用多字節表示,所以用多字節相加來實現。如果兩個數符號不同,則先檢查兩個尾數的絕對值是否相等,如果相等,則結果的尾數為0。當兩尾數的絕對值不相等時,則以絕對值大者減去絕對值小者,作為和的尾數,而且以絕對值大者的符號作為和的符號。
最後,是結果規格化。因為在相加過程中,可能有進位(最高位前麵的進位),也可能從最高位開始有0位,從而使結果是非規格化數。對於有進位情況,是使尾數右移—位,然後階碼增1。而對於最高位開始有0位的情況,是使尾數左移一位,階碼減1,直至最高位不為0,成為規格化的形式為止。
進行規格化之前,必須先檢查一下結果是否為0。如果結果是0,那麼就將尾數和階碼,事實上尾數已經都清0,並將數符變成正的就可以轉出子程序了。
要說明一點,為簡化程序編製,我們規定階碼是無符號數,用七位表示,當第七位出現1時,我們將結果清0。
2.數據的表示
一個數據用三個存儲單元存放,即一個數據字占用三個字節。
浮點數加法於程序包括取敎,對階符號處理,尾數相加和結果規格化,我們這幾部分分別編成子程序。浮點加法子程序再按順序調用這些子程序。這是一個子紐嵌套調用的實例。Z80用堆棧保護斷點,因此子程序嵌套調用的層次不受限製。下麵分別介紹這些程序。
①取數子程序
這個子程序的功能是將加數和被加數的符號、階碼進行分離處理,然後將它們包活尾數依次存入指定的暫存區中。
編製出的取數、對階、符號處理與尾數相加以及規格化等子程序,是組成加法運算程序的基礎。我們采用調用子程序的方法,按浮點加法運算的順序,組成一個完整的浮點加法運算子程序。浮點加法子程序功能實現兩個浮點數相加入口:數據在單元中出口和數在中原存被加數單元所使用的寄存器程序。
二、浮點數減法子程序
浮點數減法運算,從程序編製的角度來看是很簡單的。隻要改變減數的符號,將鹹法變為加法,再調用浮點加法子程序來進行運算即可。
三、浮點數乘法運算子程序
浮點數乘法運算程序的編製和加法程序一樣,也分成幾個部分,包括對參加運算數的規格化、符號處理與階碼處理、尾數相乘以及結果規格化等子程序。所謂符號處理,是根據被乘數和乘數的符號來決定乘積的符號。眾所周知:同符號相乘,結果(積數)符號為正反之,異號相乘,結果為負數。即乘積的符號可以由乘數和被乘數的符號位按位相加而得到。
關於階碼處理:我們知道兩個數相乘時,乘積的階碼等於乘數與被乘數的階碼之和。根據這個原則,先將兩數的階碼分離出來,再把兩個階碼相加結果就是積的階碼。尾數處理:乘積的尾數等於乘數尾數和被乘數尾數相乘的積。尾數是多字節的,可以調用多字節定點數乘法子程序來處理。
數的規格化:我們在浮點數加法子程序中已解折了,這裏不再述。
四、浮點數除法運算子程序
浮點數除法運算程序的製編與乘法運算程序一樣,也包括幾個部分;對參加運算的除數、被除數進行規格化處理,符號與階碼處理,尾數相除以及結果規格化等。所謂符號處理,是根據同符號數相除,商的符號為正;異號相除,商的符號為負原則,商的符號可以由除數和被除數的符號位按位相加而得到。至於階碼處理,根據兩數相除,商的階碼等於被階數階碼與除數階碼之差的規則,先把兩數的階碼與符號分離出來,再把兩數階碼相減,差值就是商數的階碼。這裏為簡便起見,規定凡是商的階碼為負值,均認為結果是0值,使用者認為需要絕對值小於1的數,可以根據實際情況作適當的修改。
尾數處理:商的尾數等於被餘數的尾數與除數的尾數相除所得之商值。最後是商數規格化,這與浮點數加法運算一樣,這裏不作論述了。