霓虹灯: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 a
和 float32x4_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) 内在函数的主要内容,如果未能解决你的问题,请参考以下文章