2017-11-11 204 views
4

我有这样的循环,当步骤是(0; 1)它变得无限。如果step是[1; ..),那效果很好。为什么这个for循环是无限的?

public interface FindMinI { 
double function(double x); 

static double findMinOfFuncOnInterval(int begin, int end, double step, FindMinI func) 
{ 
    double min = Double.MAX_VALUE; 

    for (int i = begin; i <= end ; i += step) { 

     if(func.function(i) <= min) 
      min = func.function(i); 

    } 
    return min; 
} 

}

+1

如果step是'0'它将如何结束? –

+1

如何在'0'和'1'之间有*整数*值? –

+1

你是什么意思step是'[0; 1)'这是否意味着你尝试用step不是一个整数? – game0ver

回答

4

如果用(0,1)之间一步尝试,这将被铸造增加i时,结果为int,你会在每一次迭代,这将导致无限循环添加0i

1

这将是无限的,因为如果step是然后加入零到会做什么。不增加意味着无限循环。

+0

任何一步是0或0.001或0.5,循环变得无限 – RaiseLtwiCe

+2

@RaiseLtwiCe再次,你怎么能有*作为一个整数?*将0.5转换为一个int值会发生什么? –

1

如果step是0,那么您将0添加到i这意味着没有任何内容被添加到该值,并且它会被限制为无限。

由于您将步骤提供为double,所以可能具有0.0001的值。然而,由于i是转换从双到int制成的整数,和0.0001 - > 0。当你施放的值这是小于1和大于0为一个整数,它变为0。

i变化到double,您可以使用十进制值进行增加。

或者,你可以改变stepint,但你将无法使用在这种情况下

类似的情况十进制步骤也可以使用乘除发现证明双例如:

(int) (500 * 0.0001) -> 0.05 as an integer = 0 

所以,当你(一个专门十进制值)加上一个双步用十进制值的整数,步变为00添加到i,并且变得无限大。

+1

@Aominè也许,但如果OP想要增加一个小数,将它改为double(或float)是唯一的方法 – Zoe