2014-04-21 213 views
0

如果double是64位IEEE-754類型,而long double是80位或128位IEEE-754類型,那麼硬件(或編譯器)使用的算法是什麼?爲了執行轉換:將double轉換爲long double的算法

double d = 3.14159; 
long double ld = (long double) d; 

而且,這將是驚人的,如果有人能列出源的算法,因爲我已經沒有運氣找到一個迄今。

+4

看看你的編譯器的彙編代碼輸出。 – OldProgrammer

+0

@OldProgrammer:無法弄清硬件是如何做到的。 –

+0

你沒有找到解釋可能是因爲它類似於簡單的操作,如擴大整數。查看想法的格式規範。取決於歸一化和非規格化,只要將尾數和指數與0相加即可,或者確保它們具有相同的最終值(例如,正確的偏差)。你可能會過度複雜化它。 –

回答

3

對於像3.14159正常數字,步驟如下:

separate the number into sign, biased exponent, and significand 
add the difference in the exponent biases for long double and double 
    (0x3fff - 0x3ff) to the exponent. 
assemble the sign, new exponent, and significand (remembering to make the 
    leading bit explicit in the Intel 80-bit format). 

在實踐中,在帶有Intel的80位格式通用的硬件中,「轉化率」是隻是一個加載指令到x87堆棧(FLD)。除非在沒有硬件支持的情況下定位平臺,否則很少需要仔細研究實際的表示細節。

1

它在C標準中定義 - 谷歌N1570找到最新免費草稿的副本。由於所有「double」值都可以用「long double」表示,因此結果是具有相同值的長雙倍值。我不認爲你會找到硬件使用的算法的精確描述,但如果你看看數據格式,它是非常直接和明顯的:

檢查指數和尾數位以查找數字是否是無窮大,NaN,歸一化數字,非規格化數字或零,在需要時產生長雙倍Infinity或NaN,調整歸一化數字的指數並將尾數位移到正確位置,添加隱式最高尾數位,將非規格化數字歸一化數字,並且歸零到長雙零。

相關問題