有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IBMiee双精度浮点字节转换

我需要在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) 个答案

  1. # 1 楼答案

    我从来没有见过,但我会尝试,在看了格式之后。(https://en.wikipedia.org/wiki/IBM_Floating_Point_Architecture#Double-precision_64-bithttps://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,尾数位是bbb。。。bbbbb,则浮点值(如果符号位为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,尾数位是bbb。。。bbbbb,浮点值(如果符号位为0)为2^(X-1023)*1。bbbbb。。。bbbbb

    因此,现在您需要找出如何以IEEE格式表示相同的值(尽可能接近;由于IBM尾数更长,因此可能会丢失一些精度)

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

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

    3. 此时,如果IBM浮点的尾数是BBB。。。bbbbb,浮点值是符号*2^(X2-1023)*0。bbbbb。。。bbbbb。但是,对于IEEE浮点,我们必须安排尾数位,以便乘以1。bbbbb。。。bbbbb。这意味着我们需要移动IBM尾数的尾数位,直到我们将1移动到二进制点左侧的位为止。每次我们移动尾数,我们都会将其加倍,这意味着我们必须通过从X2中减去1来进行补偿。因此,假设在步骤2之后,我们有X2=1031和尾数=00110111 1100。。。我们代表的数字是28*0.001101111100。。。。。我们需要将尾数左移3位,以将1移到二进制点的左位;因此,该数字等于25*1.101111100。。。。因此,在该步骤之后,X2将是1031-3=1028;这是将进入IEEE浮点的指数字段的值

    二进制点左侧的1不进入IEEE浮点。这是一个“隐含的1”。IEEE浮点的尾数位将为101111100。。。。。请注意,IBM尾数有56位;剩下的值,不算隐含的1,仍然有56位。对于IEEE浮点,您需要切掉较低的4位,使其降到52位,并且您可能需要四舍五入

    在所有这些之后,您现在有了符号位、指数字段(X2)以及构造64位IEEE浮点所需的尾数位