Я написал следующий тестовый код для проверки арифметики с фиксированной запятой и сдвига битов.
void main(){
float x = 2;
float y = 3;
float z = 1;
unsigned int * px = (unsigned int *) (& x);
unsigned int * py = (unsigned int *) (& y);
unsigned int * pz = (unsigned int *) (& z);
*px <<= 1;
*py <<= 1;
*pz <<= 1;
*pz =*px + *py;
*px >>= 1;
*py >>= 1;
*pz >>= 1;
printf("%f %f %f\n",x,y,z);
}
Результат: 2.000000 3.000000 0.000000
Почему последняя цифра 0? Я ожидал увидеть 5.000000. Я хочу использовать какую-то арифметику с фиксированной запятой, чтобы обойти использование чисел с плавающей запятой в приложении для обработки изображений. Какой самый лучший / самый простой / самый эффективный способ превратить мои массивы с плавающей запятой в целые числа? Является ли вышеупомянутый "обман компилятора" надежным обходным путем? Какие-либо предложения?