Я никогда не видел его, но попробую, посмотрев на форматы. (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 длиннее).
Значок бит будет одинаковым в обоих форматах.
Чтобы вычислить начальное значение для 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.
На данный момент, если мантисса поплавок 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 с плавающей точкой.
Как мне сделать обратное? – user3499973
Я надеялся, что дал достаточно информации, чтобы вы могли понять эту часть. Существует ограничение на то, сколько работы я готов сделать бесплатно. – ajb
Я вижу, как делать почти все это, там часть, которая намекает на меня, отменяет нормализацию, как мы узнаем, как далеко сдвинуть мантису вправо? – user3499973