10

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

4 回答 4

2

该代码不检查undefined valueclean-zerodirty-zero,但除以 4(在其他答案中讨论)是好的。OP 可能知道这一点,因为他们会发现结果是否总是错误的。指数偏差今天也让我感到困惑,所以我将引用我刚刚在这份精美文档中读到的内容:Binary floats with hidden bit

首先隐藏位被赋予另一个位置。IEEE 在小数周期之前假定该位,而 Digital 在该周期之后立即假定它。根据 IEEE,尾数的可见部分(“visman”)在句号之后立即开始,而根据数字,它在隐藏位之后开始。因此总尾数的取值范围为:

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

其次,指数符号中的过度偏差不同。[按 1 ...]

这两种效果一起使 IEEE-float 中的位模式表示的数字大小是 Digital-float 中相同位模式所代表的值的四倍。

这也解释了为什么一些参考文献指出 IEEE 偏差为 126。

于 2012-09-16T19:17:19.930 回答
1

这个页面,PDP-11 格式与 IEEE-754 浮点格式相同,除了指数在 PDP-11 中偏置为 128,而在 IEEE-754 中偏置为 127。因此,您需要除以 2.0 而不是 4.0。这不考虑 NaN 和无穷大,但从我的谷歌搜索来看,PDP-11 似乎没有这些。

您还会遇到溢出问题。PDP 格式较早溢出,但我认为这没问题,因为一旦数字已经溢出,您就无法真正做任何事情。

于 2010-02-12T09:25:27.950 回答
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 的指数偏差是 127,而不是 126。因此,上述文档要么使用了奇怪的符号,要么不正确。您可能需要除以 2 而不是 4。

于 2010-02-12T09:21:12.120 回答
0

除了 NaN 和 Inf 之外,您还可能遇到非规范值转换的问题。我不知道 PDP-11 是否支持这些,但 IEEE 754 指出,当指数字段为 0 时,数字是非正规的,实际上意味着尾数字段中隐含的前导 1 变为 0。这样就有了当数字减少时逐渐收敛到 0。

@John - IEEE 754 标准规定指数偏差是 127,而不是 126。Wiki 是正确的,其他参考是错误的。因此,该比率将为 2.0。

于 2010-02-16T15:35:18.370 回答