Некоторые процессоры ARM имеют аппаратную с плавающей запятой, а некоторые нет, поэтому возможно, что эта функция компилируется для аппаратной с плавающей запятой, но вашей платформе не хватает модуля с плавающей запятой, поэтому инструкции с плавающей запятой вызываютпроцессор сообщает о недопустимой инструкции.Если это первое вычисление с плавающей запятой в вашей тестовой программе, это, скорее всего, будет проблемой.Обратитесь к документации вашей платформы, чтобы узнать, какую опцию -march вам нужно передать gcc, или посмотрите опции компиляции, используемые какой-либо программой, которая уже работает.
Эта функция не имеет определенного поведения и без указанияЧто такое желаемое поведение, трудно предложить улучшение.Для начала попробуйте что-то вроде этого: -
void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
assert(nX * 32 < INT_MAX);
assert(nY * 32 < INT_MAX);
int sx = nX * 32;
int sy = nY * 32;
unsigned int ux = sx;
unsigned int uy = sy;
nFixed = (ux << 16) | uy;
}
Я избавился от приведения указателей, которые (как уже указывали другие) нарушают правило строгого наложения имен.Я также использовал int
вместо short
.Как правило, нет смысла иметь short
автоматических переменных, так как они все равно расширены до int
с до вычислений.(Это хорошая работа, так как смещение short
на 16 битов было бы не очень полезно.) Я добавил несколько проверок, чтобы ваши отладочные сборки могли определить, переполнится ли преобразование с плавающей точкой в целое, что вызываетнеопределенное поведение.