[英]How does the CPU “cast” a floating point x87 (i think) value?
我只是想知道 CPU 如何“投射”一個浮點數。 我的意思是,我想當我們在 C/C++ 中使用“float”或“double”時,編譯器使用的是 x87 單元,還是我錯了? (我找不到答案)那么,如果是這種情況並且浮點數沒有被模擬,編譯器如何轉換它?
我的意思是,我想當我們在 C/C++ 中使用“float”或“double”時,編譯器使用的是 x87 單元,還是我錯了?
在現代英特爾處理器上,編譯器很可能使用 SSE/AVX 寄存器。 FPU 通常不經常使用。
我只是想知道 CPU 如何“投射”一個浮點數。
將 integer 轉換為浮點數基本上是一種計算(忽略一些細節):
float
常用的 IEEE-754 binary32格式,24 位適合有效位,因此最高位集之后的第 25 位不適合。)該計算准備表示浮點數的位。 (它省略了涉及特殊情況的細節,如 NaN、無窮大和次正規數,因為在將典型的 integer 格式轉換為典型的浮點格式時不會發生這些情況。)
該計算可以“在軟件中”(即使用用於移位、測試值等的通用指令)或“在硬件中”(即使用用於進行轉換的特殊指令)執行。 所有台式計算機都有這方面的說明。 用於專用嵌入式用途的小型處理器可能沒有此類指令。
不清楚你的意思是什么
“投射”一個浮點數。 ?
如果目標體系結構具有 FPU,那么編譯器將發出 FPU 指令以操作浮點變量,這並不奇怪……為了將浮點變量分配給 int 變量,浮點數必須被截斷或舍入(向上或向下)。 通常存在特殊說明來實現此目的。
如果目標架構是“無 FPU”,那么編譯器(工具鏈)可能會使用可用的 CPU 指令提供浮點運算的軟件實現。 例如,像 a = x * y 這樣的表達式; 將等價於 a = fmul(x, y); 其中 fmul() 是編譯器提供的特殊函數(內在),可以在沒有 FPU 的情況下進行浮點運算。 當然,這通常比使用硬件 FPU 慢得多。 如果性能很重要,則在此類平台上不使用浮點運算,可以使用定點運算https://en.wikipedia.org/wiki/Fixed-point_arithmetic代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.