这个C++会将PDP-11转换为IEEE吗?

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.

Joh*_*ler 0

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。