【问题标题】:C unsigned char arithmetic operation does not works as expectedC unsigned char 算术运算不能按预期工作
【发布时间】:2013-04-20 13:00:28
【问题描述】:

这是我的sn-p代码;

Npp8u * imageHost;  
typedef unsigned char Npp8u;
...
for (int i=0;i<nHeight;++i)
    {
        for (int j=0;j<nWidth;++j)
        {
            printf("number_befre : %u\n",imageHost[i*nWidth+j] );
            imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-Npp8u(min);
            imageHost[i*nWidth+j] = imageHost[i*nWidth+j]/(max-min);
            printf("number : %u\n",imageHost[i*nWidth+j] );
        }
    }
...

一些值分配给max = 202min = 0 并从imageHost 中提取。我通过调试对其进行了纠正,但 imageHost 的内容对于整个元素为 0。我还能做些什么来使这些陈述以合理的精度发挥作用?这是关于我使用的数据类型的限制吗?

【问题讨论】:

  • Nppu(min) 不是有效的 C。您是否将其编译为 C++?
  • 抱歉代码缺失,我编辑了
  • 这实际上是 cuda 代码,但主机端
  • 写在下面的代码解释处
  • imageHost[] 元素的类型是什么?他们的价值观是什么? maxmin 是否分别等于 202 和 0?

标签: c++ type-conversion arithmetic-expressions


【解决方案1】:

您正在尝试将数字标准化为 0.0 到 1.0 之间。但是您选择的数据类型不适合,因为它只能处理整数。你需要这样的代码

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
vector<float> normalizedImageHost(nHeight*nWidth)
...
for (int i=0;i<nHeight;++i)
{
    for (int j=0;j<nWidth;++j)
    {
        normalizedImageHost[i*nWidth+j] = (float)(imageHost[i*nWidth+j] - min)/
            (max - min);
    }
}

另一种选择是保留Npp8u,但使用比例因子。例如,我们可以将所有值乘以最大 Npp8u 值 255。

typedef unsigned char Npp8u;
Npp8u * imageHost = ...;
...
for (int i=0;i<nHeight;++i)
{
    for (int j=0;j<nWidth;++j)
    {
        imageHost[i*nWidth+j] = (Npp8u)((255.0*(imageHost[i*nWidth+j] - min))/
            (max - min));
    }
}

【讨论】:

    【解决方案2】:

    我猜你的问题是 imageHost 内存。检查它的记忆。(如果可能,发布前几行) 或者这样做并调试第一行变量值的程序(第二行的断点):

    Npp8u  x=Npp8u(min);
    imageHost[i*nWidth+j] = imageHost[i*nWidth+j]-x;
    

    你获得了 imageHost 的内存(这样做):

    Npp8u ** imageHost=new *Npp8u*[nHeight];
    for(int i=0;i<nHeight;i++)
         imageHost[i]=new Npp8u[nWidth];
    

    【讨论】:

      【解决方案3】:

      如果imageHost[i*nWidth+j]小于max-min

      imageHost[i*nWidth+j]/(max-min)
      

      将为零。因为unsigned char不能在[0.0 .. 1.0]之间存储真实值

      为了获得更好的准确性,您应该使用浮点运算。

      【讨论】:

      • imageHost 属于同一类型,并且从中提取最大值和最小值。
      • 由于我执行的计算的性质,不可能以代数方式获得所有值的 0,但由于我使用的数据类型,它可能为 0,我希望听到解决方案不是问题。还是谢谢
      • 请为此类事情编写 cmets
      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2019-06-20
      • 2021-04-13
      相关资源
      最近更新 更多