Если все привыкнут к тому, что Солнце вращается вокруг Земли - это не отменяет обратного факта.
И если "все привыкли" - это не отменяет выше-высказанного соображения: "если у проца есть возможности - соблаговолите предоставить их программисту"
Хорошо, случай из жизни ...
Работаю, например, с камнем 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))
Все чисто и эффективно. Даже руками лучше не сделаешь, пожалуй (конечно же, я просматривал результаты в дизасме)...
Разве что, пришлось макрос FIX16 состряпать (просто float-конструктор - компилятор оптимизировать не хотел, почему-то).
Чтобы работали, например, такие конструкции:
__fix16 F,G;
....
F = FIX16(0.95)*F + FIX16(0.05)*G; // БИХ-фильтр первого порядка
А теперь, Netspirit, обратите внимание на правый сдвиг в операторе умножения.
Он там нужен именно знаковый. И он такой и есть, в данном конкретном (implementation-defined) исполнении.
Несмотря на то, что "все привыкли".
У меня не было таких привычек, и мне это даже казалось совершенно естественным (стандарты тогда я не просматривал)
![](/img/smilies/icon_smile.gif)