Массив байтов с 32-битной плавающей запятой в Julia

#floating-point #julia

Вопрос:

У меня есть массив байтов в Джулии:

 a = [0x41,0x40,0x00,0x00]  

который представляет собой 32-разрядное байтовое представление десятичного числа 12.0 с плавающей запятой.

32-разрядное представление IEEE 754 12.0 равно «0x41400000».

У меня есть два вопроса:

  1. Как я могу преобразовать этот массив a в число Float32 12.0 ?
  2. Обратный : Как я могу преобразовать это число Float32 12.0 в массив байтов [0x41,0x40,0x00,0x00] ?

Я пробовал reinterpret(Float32,[12.0]) и reinterpret(UInt32,[12.0]) . Никакого успеха.

Ответ №1:

Число 12.0 -это а Float64 , которое вы не должны смешивать с этим. 12f0 является Float32 версией этого. Похоже, вы делаете что-то немного в обратном направлении.

Вот как вы переосмысливаете 12f0 байты:

 jlgt; a = reinterpret(UInt8, [12f0]) 4-element reinterpret(UInt8, ::Vector{Float32}):  0x00  0x00  0x40  0x41  

(Обратите внимание, что у вас в массиве был обратный порядок байтов a .) А вот и другой путь:

 jlgt; reinterpret(Float32, a) 1-element Vector{Float32}:  12.0  

или

 jlgt; reinterpret(Float32, [0x00, 0x00, 0x40, 0x41]) 1-element reinterpret(Float32, ::Vector{UInt8}):  12.0  

Печать 12f0 as 12.0 немного неудачна, так как это неправильный литерал, но, по крайней мере, тег типа понятен.