猿问

我需要精确的值,但我的整数变量溢出

我需要除以等于一些大值之和的数字。但过了一段时间,它就溢出了,等于负数。我尝试使用 BigInteger、decimal 和 double,但它再次不起作用。


错误消息:System.ArgumentException“‘256’的值对于‘red’无效。“红色”应大于或等于 0 且小于或等于 255。


编辑:当我检查 GaussFiltresi[syc] 的值时,我看到:'GaussFiltresi[syc]' 抛出了类型为 'System.IndexOutOfRangeException' 的异常


#region Gaussian Filter


public void gaussianfilter (int SablonBoyutu,Bitmap GirisResmi,Bitmap CikisResmi)

{

int ResimGenisligi = GirisResmi.Width;

int ResimYuksekligi = GirisResmi.Height;

int syc = 0;

BigInteger toplamR;

BigInteger filtrekatsayitoplami; 

BigInteger ortalamaR;

int kernelsinir = ((SablonBoyutu - 1) / 2); 

for ( i = -kernelsinir; i <= kernelsinir; i++)

{

 for ( j = -kernelsinir; j <= kernelsinir; j++)

  {

  //some calculations

  }

}


for (int x = (kernelsinir); x < ResimGenisligi - kernelsinir; x++)

{

 for (int z = (kernelsinir); z < ResimGenisligi - kernelsinir; z++)

 {

  syc = 0;

  toplamR = 0;

  for (int y = -(kernelsinir); y <= kernelsinir; y++) 

   {

    for (int d = -(kernelsinir); d <= kernelsinir; d++)

    {

    OkunanRenk = GirisResmi.GetPixel(x + y, d + z);

    toplamR += GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R);

    //toplam R=1662424090 and GaussFiltresi[syc] = 5389698 before overflowing

     syc++;

    }

   }

ortalamaR = toplamR / filtrekatsayitoplami; //toplamR is negative 

CikisResmi.SetPixel(x, z, Color.FromArgb((int)ortalamaR, (int)ortalamaR,(int)ortalamaR));

  }

 }

}


        #endregion


DIEA
浏览 133回答 1
1回答

拉风的咖菲猫

参考System.Numerics.dll,您可以使用BigInteger代替Int64(又名long)。另一种选择是使用在, 或之前double不会溢出(到PositiveInfinity)。或者说,这超过了。10**3081e+308decimal1e+28m评论后更新: 你的表情:GaussFiltresi[syc] * OkunanRenk.R是 anint次 an int。事实上成为14650719 * 160,即给出-1950852256。要将两个操作数提升为BigInteger,以便乘法*将是大整型(永不溢出)的乘法,请将其中一个操作数转换为BigInteger(另一个将BigInteger免费提升为 ),正如我在评论中所说:GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R)所以整个语句变成:toplamR += GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R);intan与 an的乘法int将作为int乘法完成(结果可能会“环绕”)。结果将被稍后+=编辑这一事实不会改变它BigInteger。这就是为什么它在初始代码更改后不起作用的原因。
随时随地看视频慕课网APP
我要回答