如果我想要遍历所有长期范围,我会巧妙地做:
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
long
类型,我该怎么办?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但距离更远,我怎样才能达到相同的效果?答案 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
}
我没有对它进行基准测试,但我认为这样做会有明显的性能损失。