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

Neon: isnan(val) intrinsics

我想在 NEON 内在函数中使用 isnan() 功能。下面是我的代码:input1、input2 和输出类型为 float。这些值是根据输入 image/frame 的 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;
}
}

}

通过使用 newton Raphson 方法,我尝试使用 neon intrinsic 进行除法。 但是我无法获得 isnan 的任何内在函数。我得到的 __builtin_isnan() 不是内在函数。如何将 isnan 用于 float32x4_t afloat32x4_t b

一个有用的 属性 IEEE-754 浮点值是比较两个 NaN 值总是 returns 假。您可以使用此 属性 来测试 NaN,如下所示:

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

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

float32x4_t vx = { ... };

uint32x4_t vcmp = vceqq_f32(vx, vx);

对于 x 中的非 NaN 值和 false0) 对于任何 NaN 值。