2015-03-30 10 views
0

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

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; 
} 
} 

}

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

+0

В этом случае вы говорите, как проверяете a == a, что истинно каждый раз .so как это может работать как isnan ?? – user3476225

+0

Paul R, Можете ли вы, пожалуйста, продумать, представив небольшой пример. Это будет полезно для меня. – user3476225

+0

@PaulR sqrt (-1) = sqrt (-1) ?? Это условие вы можете объяснить мне своей логикой – user3476225

ответ

5

Полезное свойство-754 IEEE значения с плавающей точкой является то, что сравнение двух значений 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 значений.