我正在维护一个从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);
}-阿利斯泰尔
发布于 2012-09-17 03:17:20
代码不会检查未定义的值、干净零和脏零,但除以4 (在其他答案中讨论)是很好的。操作员可能知道这一点,因为如果结果总是错误,他们就会发现这一点。指数偏差今天也把我搞糊涂了,所以我将引用我刚刚在这篇优秀的文档中读到的内容:Binary floats with hidden bit
首先,隐藏位被赋予另一个位置。IEEE假设该位在小数周期之前,而Digital假设它紧跟在该周期之后。根据IEEE的说法,尾数的可见部分('visman')在这段时间之后立即开始,而根据Digital的说法,尾数的可见部分开始于隐藏的位之后。因此,总尾数的取值范围为:
IEEE: 1.0 =< (1.visman) < 2.0数字: 0.5 =< (0.1 visman) < 1.0
其次,指数表示法中的过度偏差是不同的。以1为单位...
这两种效果一起使得IEEE- float中的位模式表示的值大小是Digital-float中相同位模式所代表的值的四倍。
这也解释了为什么一些参考文献指出IEEE偏差为126。
发布于 2010-02-12 17:25:28
在this page中,PDP-11格式与IEEE-754浮点格式相同,不同之处在于指数在PDP-11中偏置128,而在IEEE-754中偏置127。所以,你需要除以2.0,而不是4.0。这并没有照顾到NaNs和infinities,但是从我的google搜索来看,PDP-11似乎没有这些东西。
你也会遇到溢出的问题。早些时候PDP格式溢出,但我假设这是可以的,因为一旦数字已经溢出,你就不能真正做任何事情。
发布于 2010-02-12 17:21:12
PDP-11使用混合字节顺序表示法表示浮点数。所以这部分代码
uFloat.pdp11 = (input.word[0] << 16) + input.word[1];如果您的数据在获取之前没有进行过单词交换,那么它就是正确的。
本文详细介绍了许多不同浮点格式http://www.quadibloc.com/comp/cp0201.htm的表示方法
它说测试PDP-11/VAX使用了超过128的指数记数法。而IEEE 754使用了超过126的记数法,因此如果它是正确的,除以4似乎是调整指数的正确方法。
然而,维基百科说IEEE754的指数偏差是127,而不是126。因此,上面的文档要么使用了奇怪的符号,要么是不正确的。有可能你需要除以2而不是4。
https://stackoverflow.com/questions/2250635
复制相似问题