Неон: внутренние свойства isnan(val)

Я хочу использовать isnan()functionality во встроенных функциях NEON. Ниже приведен мой код: input1, input2 и output имеют тип float. Эти значения обновляются из ROI входного изображения/кадра (пример обработки изображения).

for(x = 0;x<ht;x++){
for(y = 0;y<width;y++){
float a  = (input1[x + (y * width)]);
float b  = (input2[x + (y * width)]);
// check for division by zero
output = 0.0f;
if (!(isnan(a) | isnan(b) | (b == 0)))
{
        output[x + (y * width)] = a / b;
}
}

}

Используя метод Ньютона Рафсона, я попытался выполнить деление с помощью встроенного неона. Но я не могу получить какие-либо встроенные функции для isnan. Я получил __builtin_isnan(), который не является встроенным. Как я могу использовать isnan для float32x4_t a и float32x4_t b


person user3476225    schedule 30.03.2015    source источник
comment
в этом случае вы говорите, как проверить a == a, что верно каждый раз. Итак, как это может работать как иснан??   -  person user3476225    schedule 30.03.2015
comment
Пол Р. Не могли бы вы уточнить, приведя небольшой пример. Это будет полезно для меня.   -  person user3476225    schedule 30.03.2015
comment
@PaulR sqrt(-1) = sqrt(-1) ?? Это условие ты можешь мне объяснить своей логикой   -  person user3476225    schedule 30.03.2015


Ответы (1)


Полезным свойством значений с плавающей запятой IEEE-754 является то, что сравнение двух значений NaN всегда возвращает false. Вы можете использовать это свойство для проверки NaN следующим образом:

bool isNaN(float x)
{
    return !(x == x);
}

Этот же тест можно применить к операциям SIMD, где вектор с плавающей запятой можно сравнить с самим собой, и результат будет ложным для любого элемента, который является NaN, например.

float32x4_t vx = { ... };

uint32x4_t vcmp = vceqq_f32(vx, vx);

Элементами vcmp будут true (UINT_MAX) для значений, отличных от NaN, в x, и false (0) для любых значений NaN.

person Paul R    schedule 30.03.2015