Создать поплавок из показателя степени и значимости - PullRequest
0 голосов
/ 13 ноября 2018

Учитывая целые числа exp и 0<=sig<2^52, как я могу создать float64 с exp в качестве экспоненты и чьи значения и биты совпадают с двоичным представлением sig (в Go)?

1 Ответ

0 голосов
/ 13 ноября 2018

Стандарт IEEE-754 определяет арифметику с плавающей запятой, которую Go использует для чисел с плавающей запятой, таких как float32 и float64 (как и почти любой другой язык).

Так как ваш значение может составлять до 52 бит, очевидно, что оно может быть представлено только с использованием значения float64.

Структура памяти (биты) значения float64 описана в Двойная точностьФормат с плавающей точкой .

Вот изображение битов со значением float64 (взято из Википедии):

enter image description here

Вы утверждаете, что у вас есть значение степени и значение и значение (которое является дробной частью).

Вы можете использовать простую побитовую арифметику для построения 64-битного значения с плавающей запятой, например:

bits := exp<<52 | sig

(Примечание: exp и sig должны иметь тип uint64. Если нет, используйте преобразование типа.)

Как только у вас есть биты, вы можете использовать *Функция 1033 *math.Float64frombits() для получения значения float64:

f := math.Float64frombits(bits)

Обратите внимание, что экспонентEnt значение макета памяти - это не «прямое» число, которое вы должны использовать при вычислении значения числа, а:

Бинарный показатель с плавающей запятой двойной точности кодируется с использованием смещение-двоичное представление с нулевым смещением 1023;также известный как смещение экспоненты в стандарте IEEE 754.

Таким образом, число, закодированное в вышеуказанном формате двойной точности, рассчитывается следующим образом:

(- 1) знак x 2 e-1023 x 1.фракция

...