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