C# 如何迭代X和Y的所有可能组合
我试图遍历X和Y的所有组合。我将值增加0.01,这是一个双精度值,但它实际上从未达到0C# 如何迭代X和Y的所有可能组合,c#,java,for-loop,iterator,C#,Java,For Loop,Iterator,我试图遍历X和Y的所有组合。我将值增加0.01,这是一个双精度值,但它实际上从未达到0 for (double x = -50; x < 50; x += 0.01) { for (double y = -50; y <50; y += 0.01) { //Some code } } for(双x=-50;x
for (double x = -50; x < 50; x += 0.01)
{
for (double y = -50; y <50; y += 0.01)
{
//Some code
}
}
for(双x=-50;x<50;x+=0.01)
{
对于(double y=-50;y我怀疑您正在测试零,类似这样的东西:
if (x == 0.0) {
// it is zero.
}
for (int idxX = -5000; idxX < 5000; idxX += 1)
{
double x = (double) idxX / 100.0;
for (int idxY = -5000; idxY < 5000; idxY += 1)
{
double y = (double) idxY / 100.0;
//Some code
}
}
这可能由于浮点舍入错误而失败
浮点数的一个属性是,它们对于许多十进制数没有精确的表示。在这种情况下,您会发现0.01的最接近表示形式是“关”所以当你把0.01
加到-50.0
上五千次时,结果并不完全是0.0
您需要测试x
是否为零加上/减去一些小错误;例如,在这种情况下0.00001
应该可以
更好的是,您可以通过将循环变量声明为整数,然后将其除以0.01来给出x
和y
值,从而避免整个舍入问题;例如
for (int i = -5000; i < 5000; i++) {
double x = i / 0.01d;
// etcetera
for(int i=-5000;i<5000;i++){
双x=i/0.01d;
//等等
事实上,由于您的代码使用的是0.01
而不是0.01d
,我认为由于舍入/截断错误,表示中的错误将超过其应有的程度…,因此不可能将值0.01精确地存储在一个双精度中。因此,将其中的几个加在一起会增加t的大小该错误可能会使其丢失0。相反,请尝试十进制类型或迭代整数。问题是计算机中的浮点数通常不能准确表示十进制值,它们只能近似表示。有关详细信息,请查看wiki文章
如果您使用以下内容,您拥有的代码会更好地工作:
if (x == 0.0) {
// it is zero.
}
for (int idxX = -5000; idxX < 5000; idxX += 1)
{
double x = (double) idxX / 100.0;
for (int idxY = -5000; idxY < 5000; idxY += 1)
{
double y = (double) idxY / 100.0;
//Some code
}
}
for(int-idxX=-5000;idxX<5000;idxX+=1)
{
双x=(双)idxX/100.0;
对于(int-idxY=-5000;idxY<5000;idxY+=1)
{
双y=(双)idxY/100.0;
//一些代码
}
}
这可以避免浮点数的一些问题。试试这个技巧:
for (int x = -5000; x < 5000; x++)
{
for (int y = -5000; y <5000; y++)
{
System.out.println((double)x/100.0+" ~~ "+(double)y/100.0);
}
}
for(int x=-5000;x<5000;x++)
{
对于(int y=-5000;y改用十进制。然后你将达到0。使用double计算将产生舍入误差在大多数C派生语言中,double
和float
是以2为基数的数字。这意味着它与十进制数本身几乎没有关系,并且不一定总是准确地存储它们,它表示st存储近似值
解决这个问题的方法是使用10进制幂,幸运的是,C有一种具有此属性的类型:decimal
。将double
替换为decimal
,您可能就可以开始了。这个怎么样:
if (x == (.01-.01)){}
使用十进制而不是双精度谢谢,我来试试。要不要解释一下?另外,注意括号。它们不匹配。