10

私は、PDP-11 (エミュレートされた!) プログラムからデータを取得し、それを最新の Windows ベースのシステムに入れるプログラムを維持しています。一部のデータ値が「1.#QNAN」および「1.#QNB」として報告されるという問題が発生しています。顧客は最近、PDP-11 プログラムの「悪い」値が、最初のビットを除くすべてのビットが設定された 2 つの 16 ビット ワードで表されることを明らかにしました。エラーが発生するのは、これらを IEEE float に変換しようとしたときだと思います。

PDP-11 値を IEEE に変換するために使用される以下のコードを見つけました。私は浮動小数点表現の複雑さにあまり触れていませんが、これは少し単純に思えます! これは本当に確実に PDP-11 float を 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);
}

--- アリステア。

4

4 に答える 4

2

コードはundefined valueclean-zerodirty-zeroをチェックしませんが、他の回答で説明されている 4 で割ることは良いことです。OPは、結果が常に間違っていた場合に気付くため、おそらくそれを知っています。指数バイアスも今日私を混乱させたので、この素晴らしいドキュメントで読んだばかりのことを引用します: Binary floats with hidden bit :

最初に、隠しビットに別の位置が与えられます。IEEE はこのビットを分数期間の前に想定し、デジタルはその期間の直後に想定します。IEEE によれば、仮数の可視部分 (「visman」) はピリオドの直後に始まりますが、Digital によれば、隠しビットの後ろから始まります。したがって、合計仮数の値の範囲は次のとおりです。

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

次に、指数表記の過剰バイアスが異なります。[1 ... ずつ]

両方の効果により、IEEE-float のビット パターンは、Digital-float の同じビット パターンが表す値の 4 倍のサイズの数値を表します。

これは、一部の参考文献で IEEE バイアスが 126 であると述べられている理由も説明しています。

于 2012-09-16T19:17:19.930 に答える
1

このページから、PDP-11 形式は IEEE-754 浮動小数点形式と同じですが、PDP-11 では指数が 128 でバイアスされているのに対し、IEEE-754 では 127 でバイアスされています。したがって、4.0 ではなく 2.0 で割る必要があります。これはNaNと無限大を処理しませんが、私のGoogle検索から、PDP-11にはそれらがなかったようです.

オーバーフローの問題も発生します。PDP 形式は以前にオーバーフローしますが、数値が既にオーバーフローすると何もできないため、問題ないと思います。

于 2010-02-12T09:25:27.950 に答える
0

NaN と Inf に加えて、デノーマル値の変換でも問題が発生する場合があります。PDP-11 がこれらをサポートしているかどうかはわかりませんが、IEEE 754 では、指数フィールドが 0 の場合、数字は非正規数であり、仮数フィールドの暗黙の先行 1 が 0 になることを効果的に意味すると述べています。数が減少している場合、0 に徐々に収束します。

@John - IEEE 754 標準では、指数バイアスは 126 ではなく 127 であると規定されています。ウィキは正しく、他の参照は間違っています。したがって、比率は 2.0 になります。

于 2010-02-16T15:35:18.370 に答える
0

PDP-11 は、浮動小数点数に混合エンディアン表現を使用していました。したがって、コードのこの部分

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

データを取得する前にデータがワード スワップされていない場合は正しいです。

このドキュメントは、多くの異なる浮動小数点形式の表現の詳細を提供しますhttp://www.quadibloc.com/comp/cp0201.htm

t PDP-11/VAX では、指数に 128 を超える表記を使用したとのことです。一方、IEEE 754 では過剰な 126 表記が使用されているため、正しい場合は 4 で割るのが指数を調整する正しい方法のようです。

ただし、ウィキペディアによると、IEEE 754 の指数バイアスは 126 ではなく 127 であるとのことです。したがって、上記のドキュメントは奇妙な表記法を使用しているか、正しくありません。4 ではなく 2 で割る必要がある可能性があります。

于 2010-02-12T09:21:12.120 に答える