Преобразование массива javascript в Float32Array для буферизации и обратно

У меня есть JS-массив с плавающей запятой [0.0028808217, -0.027968751, -0.029748825], и я преобразовываю его в буфер Float32 с помощью следующей функции:

function toFloat32Buffer(array) {
  return Buffer.from(new Float32Array(array).buffer)
}

Проблема, с которой я столкнулся, заключается в преобразовании из буфера Float32 обратно в массив JS, поэтому я могу использовать те же значения, что и исходный массив.

я пробовал

function toJSArray(buffer) {
 const newBuffer = Buffer.from(buffer) 
 const floatArray = new Float32Array(newBuffer)

 return Array.from(floatArray)
}

function toFloat32Buffer(arr) {
   return Buffer.from(new Float32Array(arr).buffer)
}

const array = [0.0028808217, -0.027968751, -0.029748825]
const bufferFromFloat32 = toFloat32Buffer(array);
const array2 = toJSArray(bufferFromFloat32);

console.info('array', array)
console.info('array2', array2)

array и array2 имеют разные значения. Как мне преобразовать буфер, чтобы получить те же значения, что и исходный массив? Я запускаю это в NodeJS

Поиграйте с конструктором DataView() и используйте аргумент buffer и метод getFloat32 для извлечения каждого из значений с плавающей запятой из буфера с true, означающим, что значения должны интерпретироваться соответствующим образом. Возможно, пример непроверенной идеи (скорректируйте соответственно): pastebin.com/ZJTDr3i7

Bitcoin Murderous Maniac 02.02.2023 04:41

Я подозреваю, что вы не можете вернуть исходные значения. Исходные числа JavaScript были 64-битными значениями. Когда вы сжимаете их в 32-битные значения, вы неизбежно теряете точность. Вы не можете получить его обратно; биты исчезли.

Pointy 02.02.2023 04:58

Javascript числа имеют 64-битную двойную точность. Я не думаю, что вы можете вернуть точность, которая была удалена при преобразовании в 32-битную, за исключением хранения ее где-то еще.

Matt 02.02.2023 05:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Перепишите свою функцию toJsArray так:

function toJSArray(buffer) {
     return new Float32Array(buffer.buffer);
}

Свойство buffer буфера возвращает базовый массив буфера ArrayBuffer. Но, как отметил @Matt в своем комментарии:

Числа Javascript являются 64-битными с двойной точностью. Я не думаю, что ты можешь вернуть точность, удаленную при преобразовании в 32-битную, за исключением хранить его в другом месте. – Мэтт

Подробнее: buff.buffer

Ответ принят как подходящий

Это альтернативное решение. Рассматривая использование alloc

 function bufferToArray(buffer, size) {
    let arr = [];
    for (let i = 0; i < buffer.length / size; i++)
      arr.push(buffer.readDoubleLE(i * size));
    return arr;
  }

  function arrayToBuffer(arr, size) {
    const buffer = Buffer.allocUnsafe(size * arr.length);
    arr.map((val, index) => buffer.writeDoubleLE(val, size * index));
    return buffer;
  }

  let array = [0.0028808217, -0.027968751, -0.029748825];
  const size = Float64Array.BYTES_PER_ELEMENT; // double-precision

  const buffer = arrayToBuffer(array, size);
  const array2 = bufferToArray(buffer, size);

  console.info(array); // [0.0028808217, -0.027968751, -0.029748825]
  console.info(array2); // [0.0028808217, -0.027968751, -0.029748825]

Другие вопросы по теме