Могу ли я усечь 10-байтовое «расширенное» число и преобразовать его в 8-байтовое двойное число?

Я играю с файлами AIFF, которые включают 80-битное «расширенное» значение формата, определяющее частоту дискретизации. Поскольку ни мой выбранный язык R, ни мой настольный Mac не поддерживают этот размер изначально, мне нужно написать код преобразования. Учитывая структуру данных битов, как показано здесь и на этом изображении с этой страницы. ,

Могу ли я просто усечь часть «дроби», предполагая, что я никогда не увижу частоту дискретизации с такой высокой точностью? То есть могу ли я взять 64 бита, начиная слева, и рассматривать их как двойное число с плавающей запятой? Обратите внимание, что количество допустимых битов в экспоненте также должно быть усечено, как указано в таблице в этом вопросе

Минимальный пример: я проверил, что частота дискретизации в тестовом файле равна 44100.

10 байтов, считанных из заголовка AIFF:

40 0e ac 44 00 00 00 00 00 00

редактировать ac 44, поскольку 4 необработанных байта, преобразованных в десятичные числа, становятся 44100, что соответствует ожидаемой частоте дискретизации.

Да, если вы усекаете дробь и корректируете показатель степени, это должно работать, но необходимое изменение битов может оказаться непростым. (То есть это не просто «взять 64 бита, начиная слева».) Чтобы получить дополнительную оценку, вы можете убедиться, что новая дробь правильно округлена, а не просто усечена.

Steve Summit 01.05.2024 17:22

Я думаю, вам нужно взять 15-битный показатель степени и вычесть из него 15360, а затем повторно сохранить его как 11 бит (при условии, что он подходит).

Steve Summit 01.05.2024 17:26

О, еще одна вещь. В 80-битном расширенном формате Intel явно сохраняется первый бит мантиссы («целая часть» на рисунке), поэтому требуются дальнейшие настройки.

Steve Summit 01.05.2024 17:56

@SteveSummit, спасибо, ты подтверждаю часть моих подозрений. Я устрою несколько операций побитового сдвига и посмотрим, повезет ли мне.

Carl Witthoft 01.05.2024 19:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот прямой подход, который не требует никакого усечения.

  1. преобразовать 15-битную экспоненту. Следуйте стандартной процедуре для парных, но теперь посчитайте ExpMul = 2^(exponent - 16383) ; последнее число равно 2^14 -1 .

  2. Сохраните ведущий бит мантиссы (эквивалент неявной «1» в двойном формате). Вычислите значение остальных битов как десятичную дробь. (Примечание: для этого я использовал bigBits:fracB2B).

  3. умножай (lead_bit + fraction) * (ExpMul) .

Значение моей выборки на самом деле дало 44100 , как я и ожидал найти.

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

Как вручную преобразовать шестнадцатеричное представление fprintf с плавающей запятой в десятичное
Использовать массив длиной 2 или использовать объект для переноса двух чисел с плавающей запятой для повышения эффективности?
Почему я получаю разные результаты, когда при кодировании возведения в степень использую значения или переменные?
Является ли IEEE умножение на степень двойки ассоциативным?
Работа с переполнением и опустошением при умножении целых чисел и чисел с плавающей запятой
Можно ли представить -3/32 как двоичное значение с плавающей запятой, используя только 7 бит?
Как сложение чисел с плавающей запятой работает в «np.finfo(np.float64).max + 1»?
Как отформатировать число с плавающей запятой, чтобы исключить нули в конце дроби
Как вывести на консоль все десятичные знаки числа с плавающей запятой 128
Почему gcc -O1 влияет на std::rint()?