如何正确迭代所有长类型范围

时间:2016-02-16 17:11:06

标签: c#

如果我想要遍历所有长期范围,我会巧妙地做:

for (byte b = byte.MinValue; b <= byte.MaxValue; ++b)
{
    // Do something
}

但它永远循环!

例如,如果我这样做:

for (int i = byte.MinValue; i <= byte.MaxValue; ++i)
{
    byte b = Convert.ToByte(i);

    // Do something
}

它也永远循环,但我这样解决了:

long
  1. 使用long类型,我该怎么办?
  2. 使用import tensorflow as tf import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) x = tf.placeholder(tf.float32, [None, 784]); W = tf.Variable(tf.zeros([784, 10])); b = tf.Variable(tf.zeros([10])); y = tf.nn.softmax(tf.matmul(x, W) + b); y_ = tf.placeholder(tf.float32, [None, 10]); cross_entropy = -tf.reduce_sum(y_ * tf.log(y)); train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy); init = tf.initialize_all_variables(); xs = mnist.train.images; ys = mnist.train.labels; correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)); accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) sess = tf.Session(); sess.run(init); 类型如果我不增加1但距离更远,我怎样才能达到相同的效果?
  3. 那些&#34;想法&#34;循环一个类型范围是否正确,是否有一些问题需要警告,或者我可以做得更好吗?

3 个答案:

答案 0 :(得分:5)

当您尝试增加MaxValue时,这是由integer overflow引起的。你可以试试这个:

long i = long.MinValue;
do
{
    // Do something
} while (i++ != long.MaxValue);

这样,{<1}}的值在增加之前检查,并且循环正确终止。

答案 1 :(得分:5)

在前两个例子中,由于数字范围溢出,循环会一直持续。

i(第一个示例)或b(第二个示例)超过可以存储在long(第一个示例)或byte中的最大值时(第二个示例) ),它们的值溢出到该类型可存储的最小值,并且循环重复开始。

记住:在for循环中,首先检查循环条件,然后计数器递增。如果计数器在增量期间溢出,则后续循环条件检查仍将计算为true

要让您的示例正常工作,请尝试:

for (long i = long.MinValue; ; i++) 
{
    if (i == long.MaxValue)
    {
        break;
    }
}

如果您想增加更大的步数,请尝试:

const long step = 90000000000;

for (long i = long.MinValue; i <= long.MaxValue; )
{
    // check if loop counter overflows when incrementing by the step
    if (unchecked (i + step) < i)
    {
         break;
    }
    // otherwise it is safe to increment it
    else
    {
         i += step;
    }
}

答案 2 :(得分:1)

您可以使用BigInteger来保持循环模式不变并避免溢出:

for (BigInteger i = long.MinValue; i <= long.MaxValue; ++i)
{
    // Do something
}

我没有对它进行基准测试,但我认为这样做会有明显的性能损失。