我需要确切的值,但我的整数变量溢出了
I need exact value but my integer variable overflows
我需要除以等于一些大值之和的数字。但是过了一会儿,它溢出了,它等于一个负数。我尝试使用 BigInteger、decimal 和 double,但它不再起作用。
错误 message:System.ArgumentException '256' 的值对 'red' 无效。 '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
参考System.Numerics.dll
,您可以使用BigInteger
代替Int64
(a.k.a。long
)。
另一种选择是在 10**308
或 1e+308
之前使用不会溢出(至 PositiveInfinity
)的 double
。或者 decimal
超过 1e+28m
.
评论后更新:你的表情:
GaussFiltresi[syc] * OkunanRenk.R
是 int
乘以 int
。实际上变成了 14650719 * 160
,这给出了 -1950852256
。要将两个操作数提升为 BigInteger
,这样乘法 *
将是大整数的乘法(永远不会溢出),将任一操作数转换为 BigInteger
(另一个将提升免费 BigInteger
),正如我在评论中所说:
GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R)
所以整个语句变成:
toplamR += GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R);
int
乘以 int
将作为 int
乘法完成(结果可能 "wrap around")。结果将在稍后被 +=
编辑为 BigInteger
这一事实并没有改变。这就是为什么在您的初始代码更改后它不起作用的原因。
我需要除以等于一些大值之和的数字。但是过了一会儿,它溢出了,它等于一个负数。我尝试使用 BigInteger、decimal 和 double,但它不再起作用。
错误 message:System.ArgumentException '256' 的值对 'red' 无效。 '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
参考System.Numerics.dll
,您可以使用BigInteger
代替Int64
(a.k.a。long
)。
另一种选择是在 10**308
或 1e+308
之前使用不会溢出(至 PositiveInfinity
)的 double
。或者 decimal
超过 1e+28m
.
评论后更新:你的表情:
GaussFiltresi[syc] * OkunanRenk.R
是 int
乘以 int
。实际上变成了 14650719 * 160
,这给出了 -1950852256
。要将两个操作数提升为 BigInteger
,这样乘法 *
将是大整数的乘法(永远不会溢出),将任一操作数转换为 BigInteger
(另一个将提升免费 BigInteger
),正如我在评论中所说:
GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R)
所以整个语句变成:
toplamR += GaussFiltresi[syc] * (BigInteger)(OkunanRenk.R);
int
乘以 int
将作为 int
乘法完成(结果可能 "wrap around")。结果将在稍后被 +=
编辑为 BigInteger
这一事实并没有改变。这就是为什么在您的初始代码更改后它不起作用的原因。