私は、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);
}
--- アリステア。