霓虹灯:isnan(val)内在函数

use*_*225 0 arm simd neon cortex-a8

我想isnan()在NEON内在函数中使用功能.Below是我的代码:input1,input2和输出类型为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;
}
}
Run Code Online (Sandbox Code Playgroud)

}

通过使用牛顿Raphson方法,我试图通过使用氖内在进行除法.但是我无法获得任何内在函数.isnan我得到了 __builtin_isnan()这不是一个内在函数.我怎么能isnan用于float32x4_t afloat32x4_t b

Pau*_*l R 5

IEEE-754浮点值的一个有用属性是比较两个NaN值总是返回false.您可以使用此属性进行测试NaN,如下所示:

bool isNaN(float x)
{
    return !(x == x);
}
Run Code Online (Sandbox Code Playgroud)

这个相同的测试可以应用于SIMD操作,其中浮点向量可以与其自身进行比较,并且对于任何元素,结果将是假的NaN,例如,

float32x4_t vx = { ... };

uint32x4_t vcmp = vceqq_f32(vx, vx);
Run Code Online (Sandbox Code Playgroud)

的元件vcmp将是true(UINT_MAX),用于非NaN中值x,和false(0)为任何NaN值.