2012-08-25 32 views
3

我知道在C/Java中,浮點數的底層表示是IEEE754-32,雙點是IEEE754-64。浮動變量是如何自動提升爲double類型的?

在表達式操作中,浮點數將被自動提升爲double。又怎樣?例如,以3.7f爲例。這樣的過程是什麼?

  1. 3.7f將在使用IEEE754的存儲器中表示。它適合它4個字節。
  2. 在計算過程中,它可能會被加載到一個64位寄存器(或任何64位的地方), 將3.7f轉換爲IEEE754-64所代表。

回答

4

這是非常依賴實施的。

例如,在x86平臺上,該組FPU命令包括用於以IEEE754 floatdouble格式(以及許多其他格式)加載/存儲數據的命令。數據被加載到具有80位寬度的內部FPU寄存器中。所以在x86上實際上所有的浮點計算都是以80位的浮點精度執行的。即所有浮點數據實際上被提升爲80位精度。在這些寄存器內表示的數據如何是完全不相關的,因爲無論如何你都無法直接觀察它們。

這意味着在x86平臺上不存在單步浮點到雙精度轉換的情況。無論何時出現這種轉換需求,它實際上都實現爲兩步轉換:浮點到內部fpu和內部fpu到雙精度。

該BTW在x86 FPU計算模型和C/C++計算模型之間創建了顯着的語義差異。爲了完全匹配語言模型,處理器必須有效降低中間浮點結果的精度,從而對性能產生負面影響。許多編譯器爲用戶提供了控制FPU計算模型的選項,允許用戶選擇嚴格的C/C++一致性,更好的性能或兩者之間的選擇。

不那麼多年前FPU單元是一個可選 x86平臺的組件。無FPU平臺上的浮點計算是在軟件中進行的,既可以通過仿真FPU,也可以通過生成沒有任何FPU指令的代碼。在這樣的實現中,事情可以不同地工作,例如,直接執行從IEEE754 float到IEEE754 double的軟件轉換。

+0

那麼,與是否IEEE754時格式轉換髮生?既然你說FPU使用80位代表,而不是IEEE754。 – larmbr

+0

@larmbr:我不確定我瞭解你的問題。在現代x86上,轉換是在CPU/FPU內部實現的。 FPU命令可以將IEEE數據從存儲器讀入80位寄存器並將其存回存儲器。無論與轉換有關的步驟是否需要,都在CPU/FPU內部實現爲硬件和/或微碼。 – AnT

0

錯誤。 C標準從未在整數指定一個固定的,具體的限制和浮點型尺寸,儘管它們沒有保證類型

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 
sizeof(float) <= sizeof(double) <= sizeof(long double) 

C實現允許雖然大多數現在使用於使用任何類型的浮點格式的之間的關係IEEE-754及其後代。同樣,他們可以自由使用任何整數表示,如1的補碼或符號大小

關於促銷規則,C標準前版本將表達式中的浮點數提升爲double,但在C89/90中,規則已更改,float *浮動結果浮動結果。

If either operand has type long double, the other operand is converted to long double 
Otherwise, if either operand is double, the other operand is converted to double. 
Otherwise, if either operand is float, the other operand is converted to float. 

https://stackoverflow.com/a/5563131/995714

這一點在Java或C#是真實的,雖然,因爲它們在虛擬機上運行的字節碼,以及虛擬機的類型大小是恆定的跨平臺

相關問題