我正在維護一個從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。
+1簡單的事實,你必須保持PDP-11代碼。 – 2010-02-14 00:39:16
請注意'1.#QNB'只是'1.#QNAN'「舍入」到4個地方。 (我找不到以前的關於'#INF'被「舍入」爲'#J'的常見情況的問題。) – 2010-02-22 05:43:50