2014-02-16 101 views
3

如果您使用C語言編寫沒有FPU的微處理器,編譯器在遇到浮點文字和關鍵字時會發出錯誤信號(0.75,float,double等)?在沒有FPU的情況下浮點數會發生什麼?

另外,如果表達式的結果是分數會發生什麼?

我知道有些軟件庫可以用來做浮點運算,但是我特別想知道如果你沒有使用浮點運算的話會有什麼結果。

謝謝。

回答

6

C實現需要實現類型floatdouble以及涉及它們的算術表達式。所以如果編譯器知道目標架構沒有浮點操作,那麼它必須引入一個軟件庫來實現它。編譯器允許鏈接到外部庫,它也允許在軟件中實現浮點運算作爲內在函數,但它必須以某種方式生成代碼來完成它。

如果它不這麼做[*]那麼它不是一個符合C的實現,所以嚴格來說你不是「用C語言編程」。您正在使用您的編譯器文檔告訴您的代碼進行編程。

你最好希望涉及floatdouble類型的代碼要麼編譯失敗(因爲編譯器知道你在一個不符合要求的模式是,告訴你),否則無法鏈接(因爲編譯器發出調用庫中的仿真例程,但庫缺失)。但是,就C而言,如果你使用的不是C,那麼你是自己的。

我不知道確切的細節(我看起來多大?),但我想象回來在當天,如果您爲x87編譯了一些代碼,那麼您可能能夠使用不帶FPU的x86鏈接和加載系統。然後當你試圖執行它時,CPU會抱怨非法指令 - 很可能系統會掛起,具體取決於你正在運行的操作系統。所以最糟糕的情況是非常糟糕的。

如果表達式的結果是小數,會發生什麼?

表達式的實際結果並不重要,因爲表達式本身是用整數運算(在這種情況下結果不是小數)執行,或者用浮點運算執行(在這種情況下,問題在你發現結果之前就會出現)。

[*]或者如果你沒有指定的選項,使其做到這一點;-)

+0

我明白了。因此,即使處理器本身不能處理浮點計算,C編譯器也必須提供軟件來執行此操作。我對麼?當你說提供軟件庫時,這是否意味着作爲程序員,我必須進行明確的函數調用來完成浮點數學運算,或者編譯器能否爲我處理float = a = 3.0f/4.0f'幕後「? – jrahhali

+0

@jrahhali:編譯器需要理解和實現'float a = 3.0f/4.0f;'。 –

4

浮點是C語言的一個必要組成部分,根據C標準。如果目標硬件沒有浮點指令,那麼C實現必須以某種其他方式提供浮點操作,例如通過在軟件中模擬它們。 (所有的計算都只是位的函數,如果你有操作位和執行測試和分支的基本操作,那麼你可以計算一般計算機可以使用的任何函數)。

編譯器可以提供C的一個子集而不會浮動點,但它不會是符合標準的C編譯器。

1

通常,這樣的微處理器來臨時或者與駕駛員包或甚至與一個完整的BSP(電路板支持封裝,其由驅動程序和OS連接在一起的),它們都含有FP庫例程。

編譯器替換等效函數調用每一個浮點運算。應該考慮到這一點,尤其是迭代地調用這些操作時(在for/while循環中),因爲編譯器無法應用循環展開優化。

的不包括在項目中所需要的庫將鏈接錯誤的結果。

+0

這回答了我對Steve Jessop評論中的問題。謝謝 – jrahhali

+0

不客氣:) –

2

軟件浮點可以採取兩種形式:

  • 編譯器可以生成對呼叫內置浮點功能直接 - 例如操作1.2 * 2.5可以調用(例如)fmul(1.2, 2.5)

  • 或者對於支持FPU的體系結構,但某些設備變體可能會忽略它,通常使用FPU仿真。當遇到FP指令時,將發生無效的指令異常,並且異常處理程序將向量模擬指令的代碼。

FPU仿真具有當與真實FPU的設備上執行的相同的代碼,它將被自動地使用,並且加快執行的優點。但是,如果沒有FPU,與直接軟件實現相比通常會有小的開銷,所以如果應用程序從未期望在FPU上運行,則編譯器提供該選項時可能最好避免仿真。

軟件浮點速度非常慢,硬件支持浮點。在許多情況下,使用定點技術可以以可接受的精度提高性能。

相關問題