use*_*013 10 floating-point ieee-754
我正在维护一个程序,该程序从PDP-11(模拟!)程序中获取数据并将其置于基于Windows的现代系统中.我们遇到的问题是某些数据值被报告为"1.#QNAN"以及"1.#QNB".客户最近透露,PDP-11程序中的"坏"值由2个16位字表示,除第一个之外设置了所有位.我认为,当我们尝试将这些转换为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);
}
Run Code Online (Sandbox Code Playgroud)
--- Alistair.
PDP-11 使用混合字节序表示浮点数。所以这部分代码
uFloat.pdp11 = (input.word[0] << 16) + input.word[1];
Run Code Online (Sandbox Code Playgroud)
如果在获取数据之前尚未对数据进行字交换,则该数据是正确的。
本文档提供了许多不同浮点格式表示的详细信息http://www.quadibloc.com/comp/cp0201.htm
它说 t PDP-11/VAX 使用了超过 128 的指数表示法。而 IEEE 754 使用多余的 126 表示法,因此如果正确的话,除以 4 似乎是调整指数的正确方法。
然而,维基百科说 IEEE 754 的指数偏差是 127,而不是 126。因此,上述文档要么使用了奇怪的符号,要么是不正确的。您可能需要除以 2 而不是除以 4。