小编Joh*_*318的帖子

使用 Quiet_NaN() 和 -Ofast 时无法检测到 NaN

我正在nanmean用 OpenCV 编写一个经典函数。我尝试模拟 MatLab 的nanmean默认行为(即nanmean在第一维上减少)。CV_32F我生成一个随机大小的矩阵,最多可以有CV_64F4 个通道。我按照统一法则用随机值填充它。然后我使用std::numerical_limits<float>(if CV_32F, doubleelse)为 Nan 分配一些值:: quiet_NaN()

在调试步骤中,我正在寻找问题并打印以下内容:

T v = *it_src;
std::cout<<"v before: "<<v<<" "<<std::isnan(v)<<" "<<cvIsNaN(v)<<" "<<(v==v)<<" "<<" "<<std::isinf(v)<<" "<<((v+v)==v)<<std::endl;
Run Code Online (Sandbox Code Playgroud)

T 是模板类型,它可以是floatdouble,不能是其他。

输出是:

v before: nan 0 0 1 0 1
Run Code Online (Sandbox Code Playgroud)

所以该值是“nan”,但“std::isnan”和“CvIsNan”都无法检测到它。IEEE 754 的比较功能(如果 v 是 Nan 则v == v应该为 false)失败(v == v返回true)。唯一有效的是最后一个检查 ( (v+v) == v)。

我有几个问题: …

c++ nan

5
推荐指数
1
解决办法
393
查看次数

SSE - AVX从double转换为char

我想将双精度值的向量转换为char.我必须制作两种不同的方法,一种用于SSE2,另一种用于AVX2.

我开始使用AVX2.

__m128i sub_proc(__m256d& in)
{
    __m256d _zero_pd = _mm256_setzero_pd();

    __m256d ih_pd = _mm256_unpackhi_pd(in,_zero_pd);
    __m256d il_pd = _mm256_unpacklo_pd(in,_zero_pd);

    __m128i ih_si = _mm256_cvtpd_epi32(ih_pd);
    __m128i il_si = _mm256_cvtpd_epi32(il_pd);

    ih_si = _mm_shuffle_epi32(ih_si,_MM_SHUFFLE(3,1,2,0));
    il_si = _mm_shuffle_epi32(il_si,_MM_SHUFFLE(3,1,2,0));

    ih_si = _mm_packs_epi32(_mm_unpacklo_epi32(il_si,ih_si),_mm_unpackhi_epi32(il_si,ih_si));

    return ih_si;
}

__m128i proc(__m256d& in1,__m256d& in2)
{
      __m256d _zero_pd = _mm_setzeros_pd();

      __m128i in1_si = sub_proc(in1);
      __m128i in2_si = sub_proc(in2);

      return _mm_packs_epi16(in1_si,in2_si);
}
int main()
{

double input[32] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};

char output[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

char check[8];    

double* ibeg = input;
char* obeg = output;

for(int …
Run Code Online (Sandbox Code Playgroud)

c++ simd avx sse2 avx2

1
推荐指数
1
解决办法
769
查看次数

标签 统计

c++ ×2

avx ×1

avx2 ×1

nan ×1

simd ×1

sse2 ×1