Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2017-02-03 14:20:58 ЛС | профиль | цитата
Про ВСЕ - у меня отношение очень скептическое.
Если все привыкнут к тому, что Солнце вращается вокруг Земли - это не отменяет обратного факта.
И если "все привыкли" - это не отменяет выше-высказанного соображения: "если у проца есть возможности - соблаговолите предоставить их программисту"

Хорошо, случай из жизни ...
Работаю, например, с камнем Cortex-M3 (конкретно - STM32F105). Это означает, что машина 32-битная, и сопроцессора нет.
Задача - цифровая фильтрация звуковых сигналов.
Эффективность - важна, мягко говоря (частота проца - всего-то 72 МГц).

Какое решение мы выбрали (точнее, я лично настоял).
Сделали свой формат "с фиксированной точкой". Типа: старшие 16 бит - целая часть, а младшие 16 - дробная.
Примерно так сделали:
class __fix16 { //??? to ENITOOLs
int X;
public:
__fix16(int y){X = y;}
__fix16 operator+(__fix16 y){X += y.X;return *this;}
__fix16 operator*(__fix16 y){X = (X*__int64(y.X))>>16;return *this;}
__fix16 operator=(__fix16 y){X = y.X;return *this;}
operator int(){return X>>16;}
};
#define FIX16(y) __fix16(y*(1<<16))
Эффективности Keil-а хватило для inline-реализации умножения и без библиотечных функций для float/long-арифметики.
Все чисто и эффективно. Даже руками лучше не сделаешь, пожалуй (конечно же, я просматривал результаты в дизасме)...
Разве что, пришлось макрос FIX16 состряпать (просто float-конструктор - компилятор оптимизировать не хотел, почему-то).
Чтобы работали, например, такие конструкции:
  __fix16 F,G;
....
F = FIX16(0.95)*F + FIX16(0.05)*G; // БИХ-фильтр первого порядка
Работали, как уже говорил, без библиотечных функций для float/long-арифметики. Просто, в нужном месте используются 32-битные константы (рассчитанные на этапе компиляции).

А теперь, Netspirit, обратите внимание на правый сдвиг в операторе умножения.
Он там нужен именно знаковый. И он такой и есть, в данном конкретном (implementation-defined) исполнении.
Несмотря на то, что "все привыкли".

У меня не было таких привычек, и мне это даже казалось совершенно естественным (стандарты тогда я не просматривал)
карма: 9

0
Редактировалось 15 раз(а), последний 2017-02-03 15:36:12