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

Posted

技术标签:

【中文标题】霓虹灯:isnan(val) 内在函数【英文标题】:Neon: isnan(val) intrinsics 【发布时间】:2015-03-30 15:02:52 【问题描述】:

我想在 NEON 内在函数中使用isnan()functionality。下面是我的代码: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;


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

【问题讨论】:

在这种情况下,您会说 check a == a ,每次都是如此。那么这如何像 isnan 一样工作?? Paul R,能否请您举个小例子详细说明一下。这对我有帮助。 @PaulR sqrt(-1) = sqrt(-1) ??这种情况你能用你的逻辑解释我吗 【参考方案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);

对于x 中的非NaN 值,vcmp 的元素将是true (UINT_MAX),对于任何NaN 值,false (0)。

【讨论】:

以上是关于霓虹灯:isnan(val) 内在函数的主要内容,如果未能解决你的问题,请参考以下文章

为啥乘法、加法的霓虹内在函数比运算符慢?

你如何使用霓虹内在函数加载 3 个浮点数

与霓虹内在函数中的浮点数比较

向量中的内在霓虹灯交换元素

如何使用霓虹内在函数准确地将 uchar 转换为 float32 ,反之亦然

霓虹灯等效于 mm_madd_epi16 和 mm_maddubs_epi16