首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个C++会把PDP-11的浮点数转换成IEEE吗?

这个C++会把PDP-11的浮点数转换成IEEE吗?
EN

Stack Overflow用户
提问于 2010-02-12 17:07:20
回答 4查看 2K关注 0票数 10

我正在维护一个从PDP-11获取数据的程序(仿真!)程序,并将其放入现代的基于Windows的系统中。我们遇到了一些报告为"1.#QNAN“和"1.#QNB”的数据值的问题。客户最近透露,PDP-11程序中的“坏”值由2个16位字表示,除第一位外,所有位都已设置。我认为,当我们试图将这些转换为IEEE浮点数时,我们就会得到错误。

我找到了下面的代码,它用于将PDP-11值转换为IEEE。我不太了解浮点表示的复杂性,但这对我来说似乎有点简单!这真的能可靠地将PDP-11浮点数转换为IEEE吗?

代码语言:javascript
复制
// ---------------------------------------------------------------- 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);
}

-阿利斯泰尔

EN

回答 4

Stack Overflow用户

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 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格式溢出,但我假设这是可以的,因为一旦数字已经溢出,你就不能真正做任何事情。

票数 1
EN

Stack Overflow用户

发布于 2010-02-12 17:21:12

PDP-11使用混合字节顺序表示法表示浮点数。所以这部分代码

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2250635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档