структуры данных для работы с плавающей запятой в процессоре с фиксированной запятой

Мне нужно запрограммировать процессор с фиксированной запятой, который использовался для устаревшего приложения. Требуются новые функции, и эти функции нуждаются в большом динамическом диапазоне, скорее всего, за пределами диапазона фиксированной точки даже после масштабирования. Поскольку процессор не будет заменен по нескольким причинам, я планирую включить операцию с плавающей запятой на основе арифметики с фиксированной запятой — в основном программный подход. Я хочу определить несколько структур данных для представления чисел с плавающей запятой в C для базового процессора с фиксированной запятой. Можно ли вообще это сделать? Я планирую использовать IEEE представление с плавающей точкой . Какие структуры данных были бы хороши для выполнения основных операций, таких как умножение, деление, сложение и суб. Уже есть какие-нибудь библиотеки с открытым исходным кодом, доступные в C / C ++?

2

Решение

Большинство инструментов разработки C для микроконтроллеров без встроенной поддержки с плавающей запятой предоставляют программные библиотеки для операций с плавающей запятой. Даже если вы занимаетесь программированием на ассемблере, вы, вероятно, можете использовать эти библиотеки. (Просто любопытно, какой процессор и какие инструменты разработки вы используете?)

Однако, если вы серьезно относитесь к написанию своих собственных библиотек с плавающей запятой, самый эффективный способ — рассматривать подпрограммы как подпрограммы, работающие с целыми числами. Вы можете использовать объединения или код, подобный следующему, чтобы преобразовать представление с плавающей точкой в ​​целочисленное.

uint32_t integer_representation = *(uint32_t *)&fvalue;

Обратите внимание, что это по своей сути неопределенное поведение, так как формат числа с плавающей запятой не указан в стандарте C.

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

Кроме того, если вы используете подпрограммы самостоятельно, вам, вероятно, не удастся оставить части стандарта не реализованными, такие как флаги исключений, субнормальные числа, NaN и Inf и т. Д.

1

Другие решения

Вам действительно не нужно любой структуры данных, чтобы сделать это. Вы просто используете целые числа для представления кодировок с плавающей точкой и целые числа для представления неупакованных знаков, экспоненты и значимых полей.

0

По вопросам рекламы [email protected]