2010-03-31 31 views
1

什麼決定了x87 FPU控制字的默認設置 - 特別是精度控制字段?編譯器是否根據目標處理器設置它?是否有編譯器選項來改變它?什麼決定了x87 FPU控制字的默認設置?

使用Microsoft Visual C++的Intel酷睿雙核處理器2008 Express版本,用於精確控制字段的默認設置爲「01B」,意爲雙(53位)精度。我想知道 - 爲什麼默認不是「11」b或擴展(64位)精度?

(我知道我可以使用_controlfp改變它。)

回答

0

從理論的角度來看:可能是用它的最後一件事,或限制,不管英特爾決定將是一個很好的默認。

從實際角度出發:在開始工作之前將其設置爲所需的精度。明確的默認值通常優於默認的默認值。

+0

但是我問,如果我是'使用它的第一件事',它是如何開始的?爲什麼默認值是53位而不是64位? – 2010-04-02 00:12:19

+0

但是你不是第一個使用它的人。有可能正在執行的BIOS代碼。 – Broam 2010-04-05 14:39:20

+0

這是我試圖找出的一件事 - 在哪裏初始化。 – 2010-04-05 15:49:32

0

當操作系統建立進程(或線程) - 也就是說,當程序啓動時,它負責將控制寄存器初始化爲默認狀態(正是默認狀態在不同平臺之間會有所不同)。它還負責在上下文切換周圍保存和恢復狀態,以便您的程序不會將狀態放入也在系統上運行的其他進程中。

除此之外,在執行代碼之前編譯器或語言運行時可能會修改狀態。

因此,要麼:Windows的默認狀態FP爲53位精度或VS2008插入代碼默認設置處理器53位精度。 Windows默認進程狀態應記錄在該平臺的ABI文檔中。

2

有在Microsoft C運行時DLL(MSVCRT.DLL),它會改變FPCW,這可能取決於加載DLL的順序更改應用程序行爲的錯誤。

因此,如果您關心FPCW設置,不僅在執行前將其更改爲所需的設置(甚至在函數調用邊界上),還會在完成後將其更改回來。 (如果你打電話給任何功能或庫,請小心可能會改變它的被調用者,不要那麼體貼以至於不能爲你改變它!)

另外請注意:FPCW修改費用昂貴,但不是很昂貴檢查。所以,如果有很好的機會,它已經按照你想要的方式設置,你可以通過在修改它之前檢查它來節省很多時間。

+0

@ArchaeaSW - 你有KB或MS引用這個bug嗎?我一直無法找到任何相關的東西,並想知道哪個版本有這個錯誤。 – holtavolt 2011-04-27 15:43:57

+0

嗯,我試圖挖起來,無法找到它。不過,當發現這個錯誤時,Web和微軟的知識庫過程仍然是新的。 FPCW仍然是架構中最差的線程控制狀態之一。那裏的大部分狀態(特別是循環模式)應該按照每條指令進行編碼。 – ArchaeaSoftware 2011-05-26 19:07:14

0

我一直在想關於同一個原始問題。我在Windows 2000(32位)上使用VC++ 6 & MinGW進行了實驗。

一個簡單的3行程序使用MinGW(0x037f)進行編譯時,爲VC++和'Extended precision'設置了「雙精度」(0x027f)的FPU控制字。 在同一臺機器上,gcc/Linux-32具有相同的擴展精度(0x37f)。 即MinGW和gcc/Linux似乎具有相同的FPU設置。