2010-02-12 20 views
10

我正在維護一個從PDP-11(模擬!)程序獲取數據並將其放入現代基於Windows的系統的程序。我們遇到了一些數據值被報告爲「1.#QNAN」和「1.#QNB」的問題。客戶最近透露,PDP-11程序中的「壞」值由2個16位字表示,除第一個以外,所有位均置1。我認爲,當我們試圖將這些轉換爲IEEE浮點數時,我們就會發現錯誤。這個C++將PDP-11轉換爲IEEE嗎?

我發現下面的代碼用於將PDP-11值轉換爲IEEE。我並不是很接觸浮點表示的複雜性,但這對我來說似乎有點簡單!這真的可靠地將PDP-11浮點數轉換爲IEEE嗎?

// ---------------------------------------------------------------- cnvPDPfloat 
// CNVPDPFLOAT 
// ---------------------------------------------------------------------------- 
// 
// Converts PDP11 float (two 16-bit words) into IEEE float 
// 
// PDP11 and IEEE floats have same layout so can be mapped onto eachother. 
// But PDP11 exponent must have 2 subtracted for IEEE. Or just divide by 4. 
// 
float cnvPDPfloat(PDP11Float input) 
{ 
union 
{ 
    unsigned long pdp11; 
    float ieee; 
} uFloat; 

uFloat.pdp11 = (input.word[0] << 16) + input.word[1]; 

return (uFloat.ieee/(float) 4.0); 
} 

--- Alistair。

+3

+1簡單的事實,你必須保持PDP-11代碼。 – 2010-02-14 00:39:16

+0

請注意'1.#QNB'只是'1.#QNAN'「舍入」到4個地方。 (我找不到以前的關於'#INF'被「舍入」爲'#J'的常見情況的問題。) – 2010-02-22 05:43:50

回答

0

PDP-11使用浮點數的混合端表示法。因此,這部分代碼

uFloat.pdp11 = (input.word[0] << 16) + input.word[1]; 

如果您的數據在獲得之前尚未進行字詞交換,則該字段是正確的。

本文檔提供的表示的細節進行了大量的不同的浮點格式http://www.quadibloc.com/comp/cp0201.htm

它說噸PDP-11/VAX中使用過量的128符號的指數。而IEEE 754使用超過126的符號,所以如果它是正確的,除以4似乎是調整指數的正確方法。

但是,維基百科說IEEE 754的指數偏差是127,而不是126.所以無論是上述文件使用的是一種奇怪的符號,或者它是不正確的。您可能需要除以2而不是4.

1

this page開始,PDP-11格式與IEEE-754浮點格式相同,只是指數在PDP-11中偏向128,而它在IEEE-754中偏向127。所以,你需要除以2.0而不是4.0。這不涉及NaN和無限,但從我的谷歌搜索,看起來像PDP-11沒有這些。

你也會遇到溢出的問題。 PDP格式較早溢出,但我認爲這是好的,因爲一旦數字已經溢出,您無法做任何事情。

+0

錯誤。它應該除以4.請參閱下面的答案。 – marcin 2012-09-16 19:20:05

0

除了NaN和Inf之外,還可能在非規範值轉換時遇到問題。我不知道PDP-11是否支持這些,但IEEE 754指出,當指數字段爲0時,這些數字是非規範的,這實際上意味着尾數字段中隱含的前導1變爲0.這樣就有一個數字減少時逐漸收斂到0。

@John - IEEE 754標準指出指數偏差是127,而不是126.維基是正確的,而另一個引用是錯誤的。所以,這個比例是2.0。

2

的代碼不檢查未定義的值清潔零髒零,但除以4,在其他的答案所討論的,是良好的。 OP可能知道它,因爲如果結果總是錯誤的,他們會發現。 的指數偏差今天也搞糊塗了,所以我會引用我剛纔這一優良文檔閱讀:Binary floats with hidden bit

起初隱藏位給出另一個位置。 IEEE在分數階段之前假定該位爲 ,Digital在 之後立即假定該位。根據IEEE,尾數 ('visman')的可見部分在該時段之後立即開始,而根據 數字它在隱藏位後面開始。因此,總 尾數的值的範圍是:

IEEE:  1.0 =< (1.visman) < 2.0 
Digital: 0.5 =< (0.1 visman) < 1.0 

在第二在指數的表示法中過量-偏壓不同。 [1 ...]

兩種效應共同構成,在一個浮動IEEE- 的位模式代表一個數字,在一數字浮子相同的位 圖案代表的值的大小的4倍。

這也解釋了爲什麼一些參考指出IEEE偏差爲126