为什么我的 for 循环永远不会结束?
Why does my for loop never end?
所以,我有这段代码应该将要测试的每个范围添加到 'freqDistRanges' 向量中。 'values' 是一个双精度类型的向量,用于保存用户输入。我的问题是,如果我在 'values' 数组中输入的值少于十个,则 for 循环永远不会结束。我不明白为什么会这样,例如,如果只输入一个值,freqDistRange 将等于 0.1。当 i > 0.1 时 for 循环将停止,并且 i 在第二次迭代中等于 0.1,在第二次迭代中等于 0.2,这应该结束 for 循环。我在这里错过了什么,我觉得这是我忽略的简单事情。感谢您的帮助。
double freqDistRange = ((double)values.size() / 10); // there will be ten ranges
// add each range to the 'ranges' vector
for (auto i = 0; i <= ((double)values.size() * freqDistRange); i += freqDistRange)
freqDistRanges.push_back(i);
i
是一个 int
,这里只能保存整数值。如果 i
是 0
,并且您向它添加 0.1
,它仍然是 0
。如果你将 0.1
添加到它一百万次,它将 仍然 是 0
.
你应该改变:
auto i = 0;
至:
double i = 0;
或:
auto i = 0.0;
如果您必须确保选择所需类型的初始值,那么在这种特殊情况下使用 auto
没有任何好处。如果你知道你需要类型 double
,你还不如将它显式声明为 double
.
问题是您打算将 double
作为循环计数器,但是 auto i = 0;
根据 0
推导出类型,即 int
。这是在 for
循环中使用 auto
时需要注意的一个陷阱。 See here 关于该主题的另一个 SO 问题。
但是,如果您想要恰好有 11 个步骤,那么使用 double
作为变量类型 不是 一个好主意。这是因为浮点运算本质上并不十分精确,因此由于舍入误差,您可能会得到 10 或 12 步。
要获得精确的行为,请使用整数类型作为循环计数器。这里:
double freqDistRange = values.size() / 10.0;
for (int i = 0; i <= 10; ++i)
{
freqDistRanges.push_back( i * freqDistRange );
}
所以,我有这段代码应该将要测试的每个范围添加到 'freqDistRanges' 向量中。 'values' 是一个双精度类型的向量,用于保存用户输入。我的问题是,如果我在 'values' 数组中输入的值少于十个,则 for 循环永远不会结束。我不明白为什么会这样,例如,如果只输入一个值,freqDistRange 将等于 0.1。当 i > 0.1 时 for 循环将停止,并且 i 在第二次迭代中等于 0.1,在第二次迭代中等于 0.2,这应该结束 for 循环。我在这里错过了什么,我觉得这是我忽略的简单事情。感谢您的帮助。
double freqDistRange = ((double)values.size() / 10); // there will be ten ranges
// add each range to the 'ranges' vector
for (auto i = 0; i <= ((double)values.size() * freqDistRange); i += freqDistRange)
freqDistRanges.push_back(i);
i
是一个 int
,这里只能保存整数值。如果 i
是 0
,并且您向它添加 0.1
,它仍然是 0
。如果你将 0.1
添加到它一百万次,它将 仍然 是 0
.
你应该改变:
auto i = 0;
至:
double i = 0;
或:
auto i = 0.0;
如果您必须确保选择所需类型的初始值,那么在这种特殊情况下使用 auto
没有任何好处。如果你知道你需要类型 double
,你还不如将它显式声明为 double
.
问题是您打算将 double
作为循环计数器,但是 auto i = 0;
根据 0
推导出类型,即 int
。这是在 for
循环中使用 auto
时需要注意的一个陷阱。 See here 关于该主题的另一个 SO 问题。
但是,如果您想要恰好有 11 个步骤,那么使用 double
作为变量类型 不是 一个好主意。这是因为浮点运算本质上并不十分精确,因此由于舍入误差,您可能会得到 10 或 12 步。
要获得精确的行为,请使用整数类型作为循环计数器。这里:
double freqDistRange = values.size() / 10.0;
for (int i = 0; i <= 10; ++i)
{
freqDistRanges.push_back( i * freqDistRange );
}