Как разделить неонные свойства на число с плавающей точкой
Прежде всего, извините за мой английский не совершенен, но я постараюсь объяснить свою проблему все, что могу.
Немного о том, что я делаю, это обработка изображения на четыре пикселя в то время, это на armv7 для приложения для Android.
Я хочу разделить вектор float32x4_t другим вектором, но числа в нем являются переменными и от 0,7 до 3,85 меньше, и единственный способ, которым я хочу разделить, - это правая смена, но для числа 2 ^ n, поэтому если некоторые из них могут помочь в этом.
Также я новичок в этом, поэтому любые комментарии приветствуются, или если вам нужна дополнительная информация о том, что я делаю, я постараюсь сделать все возможное, чтобы ответить на любой вопрос.
ok я попробую объяснить это с помощью примера:
как я могу выполнять эти инструкции с неоновными встроенными функциями
float32x4_t a = {25.3,34.1,11.0,25.1};
float32x4_t b = {1.2,3.5,2.5,2.0};
// somthing like this
float32x4 resultado = a/b; // {21.08,9.74,4.4,12.55}
просто помните, что b может меняться между интервалами, потому что все это на a, для которого изменяются вектор b
Ответы
Ответ 1
Набор команд NEON не имеет деления с плавающей запятой.
Если вы знаете априори, что ваши значения не очень масштабируются, и вам не требуется правильное округление (это почти наверняка имеет место, если вы выполняете обработку изображений), тогда вы можете использовать взаимную оценку, шаг уточнения, и умножьте вместо деления:
// get an initial estimate of 1/b.
float32x4_t reciprocal = vrecpeq_f32(b);
// use a couple Newton-Raphson steps to refine the estimate. Depending on your
// application accuracy requirements, you may be able to get away with only
// one refinement (instead of the two used here). Be sure to test!
reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal);
reciprocal = vmulq_f32(vrecpsq_f32(b, reciprocal), reciprocal);
// and finally, compute a/b = a*(1/b)
float32x4_t result = vmulq_f32(a,reciprocal);