Как разделить неонные свойства на число с плавающей точкой

Прежде всего, извините за мой английский не совершенен, но я постараюсь объяснить свою проблему все, что могу.

Немного о том, что я делаю, это обработка изображения на четыре пикселя в то время, это на 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);