簡體   English   中英

CPU如何“投射”浮點x87(我認為)值?

[英]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 轉換為浮點數基本上是一種計算(忽略一些細節):

  • 從 integer 的二進制(對於無符號類型)或二進制補碼(對於有符號類型)表示開始。
  • 如果數字為零,則返回所有位為零。
  • 如果它是負數,請記住這一點並將數字取反以使其為正數。
  • 找到 integer 中設置的最高位。
  • 找到適合目標格式有效位的最低位。 (例如,對於float常用的 IEEE-754 binary32格式,24 位適合有效位,因此最高位集之后的第 25 位不適合。)
  • 將有效數字結束的 position 處的數字四舍五入。
  • 計算指數,即最高位集所在位置的 function。 添加用於編碼指數的“偏差”(二進制 32 為 127,二進制 64 為 1023)。
  • 組合一個符號位、指數位和有效數位(省略高位,因為它始終為 1)。 返回那些位。

該計算准備表示浮點數的位。 (它省略了涉及特殊情況的細節,如 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM