我正在维护一个程序,该程序从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);
}

---阿利斯泰尔。

最佳答案

该代码不检查未定义的值,零清除和脏零,但除以4,在其他答案中讨论过,则很好。 OP可能知道这一点,因为如果结果始终是错误的,他们会发现。
指数偏向今天也使我感到困惑,因此,我将引用我在这份精美文档中刚刚阅读的内容:Binary floats with hidden bit:



这也解释了为什么有些引用文献指出IEEE偏差为126。

关于floating-point - 此C++会将PDP-11浮点数转换为IEEE吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2250635/

10-11 15:21