2016-06-23 3 views
2

Мне нужно преобразование с плавающей запятой IBM-IEEE с байтами в Java. Мне удалось успешно выполнить преобразования одноточечных байтов с использованием http://www.thecodingforums.com/threads/c-code-for-converting-ibm-370-floating-point-to-ieee-754.438469.java - преобразование байтов с плавающей запятой с двойной точностью по IBM-IEEE

Но мне также нужно преобразовать байты двойных удвоений. Повсюду, где я выгляжу, кажется, показано только преобразование с одной точностью. Самое близкое, что я получил, это функция r8ibmieee в http://spdf.sci.gsfc.nasa.gov/pub/documents/old/miscellaeous_documents_from_nssdc/b46645.txt, но она использует C union/bitfields и только преобразует IBM в IEEE (а не наоборот). Я надеялся на решение, подобное первой ссылке, которая принимает байтовый массив или шестнадцатеричную строку и выводит байтовый массив или шестую строку. У кого-нибудь есть алгоритм для преобразования байтов с двойной точностью из IBM в IEEE и наоборот, который будет работать на Java?

ответ

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, то значение поплавка (если бит знака равен 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 

Если экспонента Х и мантисса биты BBBBB ... BBBBB, значение поплавка (если бит знака равен 0) равно 2^(X -1023) * 1.bbbbb ... bbbbb.

Итак, теперь вам нужно выяснить, как выразить одно и то же значение в формате IEEE (как можно ближе, возможно, вы потеряете несколько бит точности, поскольку IBM mantissa длиннее).

  1. Значок бит будет одинаковым в обоих форматах.

  2. Чтобы вычислить начальное значение для IEEE показателя: Если показатель IBM является X и IEEE показатель является X, нам нужно найти X такие что 16^(X -64) = 2^(X -1023).Левая сторона будет равна 2^(4 * X -256), поэтому, так как полномочия 2 должен быть таким же, это дает нам X = 4 * X -256 + 1023 = 4 * X +767.

  3. На данный момент, если мантисса поплавок IBM является BBBBB ... BBBBB, значение с плавающей точкой знак * 2^(X -1023) * 0.bbbbb ... BBBBB. Однако для поплавка IEEE мы должны упорядочить биты мантиссы, чтобы умножить на 1.bbbbb ... bbbbb. Это означает, что нам нужно сдвинуть бит мантиссы IBM mantissa, пока мы не переместим 1 в место бит слева от двоичной точки. Каждый раз, когда мы переносим мантиссу, мы удваиваем ее, что означает, что мы должны компенсировать вычитанием 1 из X. Предположим, что после шага 2 имеем X = 1031 и mantissa = 0011 0111 1100 ... Число, которое мы представляем, равно 2 * 0.001101111100 ..... Нам нужно будет сдвинуть мантисса оставила 3 ​​места, чтобы получить 1 в бит слева от двоичной точки; Таким образом, X после этого этапа будет 1031 - 3 = 1028; это значение, которое войдет в поле экспоненты поплавка IEEE.

1 слева от двоичной точки не входит в поплавок IEEE. Это «подразумевается 1». Биты мантиссы поплавка IEEE будут равны 101111100 ..... Обратите внимание: IBM mantissa имеет 56 бит; значение, которое вы оставили, не считая подразумеваемого 1, будет по-прежнему иметь 56 бит. Вам нужно будет отрубить нижние 4 бита, чтобы довести его до 52 для поплавка IEEE, и вам может понадобиться раунд.

После всего этого, теперь у вас есть знаковый бит, поле показателя (X), а мантисса биты, которые необходимо построить 64-битный IEEE с плавающей точкой.

+0

Как мне сделать обратное? – user3499973

+0

Я надеялся, что дал достаточно информации, чтобы вы могли понять эту часть. Существует ограничение на то, сколько работы я готов сделать бесплатно. – ajb

+0

Я вижу, как делать почти все это, там часть, которая намекает на меня, отменяет нормализацию, как мы узнаем, как далеко сдвинуть мантису вправо? – user3499973