java - IBM-IEEE双精度浮点字节转换

时间:2016-06-23 05:07:22

标签: java floating-point bytearray ieee-754

我需要在Java中进行字节数组的IBM-IEEE浮点转换。我能够使用http://www.thecodingforums.com/threads/c-code-for-converting-ibm-370-floating-point-to-ieee-754.438469成功地进行单精度浮点字节的转换。

但我还需要转换双精度双精度字节。我看的每个地方似乎只显示单精度转换。我最接近的是http://spdf.sci.gsfc.nasa.gov/pub/documents/old/miscellaeous_documents_from_nssdc/b46645.txt中的r8ibmieee函数,但它使用C联合/位域并且只将IBM转换为IEEE(而不是相反)。我希望有一个类似于第一个链接的解决方案,它接受一个字节数组或十六进制字符串并输出一个字节数组或十六进制字符串。有没有人有一个算法可以将双精度字节从IBM转换为IEEE,反之亦然,可以在Java中使用?

1 个答案:

答案 0 :(得分:2)

我从未见过一个,但在看完这些格式之后我会尝试一下。 (https://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture#Double-precision_64-bit; https://en.wikipedia.org/wiki/Double-precision_floating-point_format

我建议您使用long(64位整数)值;它会容易得多。您将一个字节数组转换为long,使用它来转换浮点格式,然后将生成的long转换回字节数组。我不会告诉你如何在long和字节数组值之间进行转换,因为我不知道你的字节数组是小端还是大端。

IBM 64位浮点数的格式为

1  sign bit
7  exponent bits (power of 16), bias = 64
56  mantissa bits

如果指数是 X 且尾数位是bbbbb ... bbbbb,那么float的值(如果符号位为0)是16 ^( X -64)* 0.bbbbb ... bbbbb。

IEEE 754 64位浮点数的格式为

1   sign bit
11  exponent bits (power of 2), bias = 1023
52  mantissa bits, with an implied a bit

如果指数为 X 且尾数位为bbbbb ... bbbbb,则float的值(如果符号位为0)为2 ^( X -1023)* 1.bbbbb ... bbbbb。

所以现在你需要弄清楚如何用IEEE格式表达相同的值(尽可能接近;你可能会失去一些精度,因为IBM尾数较长)。

  1. 两种格式的符号位都相同。

  2. 计算IEEE指数的初始值:如果IBM指数为 X 1 ,且IEEE指数为 X 2 ,我们需要找到 X 2 ,这样16 ^( X 1 -64)= 2 ^( X 2 -1023)。左边将等于2 ^(4 * X 1 -256),因此2的幂必须相同,这给了我们 X 2 = 4 * X 1 -256 + 1023 = 4 * X 1 767

  3. 此时,如果IBM float的尾数为bbbbb ... bbbbb,则浮点值为sign * 2 ^( X 2 -1023)* 0.bbbbb ... bbbbb。但是,对于IEEE浮点数,我们必须排列尾数位,以便我们乘以1.bbbbb ... bbbbb。这意味着我们需要移动IBM尾数的尾数位,直到我们将1移位到二进制点左侧的位位置。每次我们移动尾数时,我们将它加倍,这意味着我们必须通过从 X 2 中减去1进行补偿。因此,假设在步骤2之后,我们 X 2 = 1031并且尾数= 0011 0111 1100 ...我们所代表的数字是2 8 < / sup> * 0.001101111100 .....我们需要将尾数左移3个位置以使1进入二进制点左边的位;因此,在该步骤之后 X 2 将是1031-3 = 1028;因此,该数字等于2 5 * 1.101111100 ....这是将进入IEEE float的指数字段的值。

  4. 二进制点左侧的1不会进入IEEE float。这是一个“暗示1”。 IEEE浮点数的尾数位为101111100 .....注意,IBM尾数有56位;您剩下的值,不包括隐含的1,仍将有56位。您将需要切断低4位以使IEEE浮点数降至52,您可能想要舍入。

    毕竟,你现在有了符号位,指数字段( X 2 ),以及构造64位IEEE浮点所需的尾数位