我想迭代一系列浮点数,例如以下示例。
for (double d = 1.0; d <= 2.0; d += 0.1)
{
cout << d << endl;
}
因为无法准确表示0.1,所以不打印2.0的最后一个值。
如何确保不会省略此案例和类似案例中的最后一个值?
答案 0 :(得分:11)
循环整数,除以浮点数:
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setprecision(1) << std::fixed;
for (int d = 10; d <= 20; ++d)
{
std::cout << d/10. << std::endl;
}
}
输出:
1.0
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0
答案 1 :(得分:4)
由于浮点数在这种情况下不准确,我通常会通过&#34;模拟&#34;他们通过整数。至少对于像这样的简单案例。
for (int i = 10; i <= 20; ++i)
{
cout << i / 10.0 << endl;
}
这应该为您提供最接近任何值的浮点数。
答案 2 :(得分:3)
如果你使用固定增量(如你的例子),一种方法是使用整数:
for (int i = 10; i != 20; ++i)
{
cout << (i / 10.0) << endl;
}
答案 3 :(得分:1)
最好使用并更新整数值来控制循环。并使用和更新浮点值以用于输出。我假设你的真实案例比这更复杂。
这将执行循环正确的次数并保存int到float转换。双重值将是准确的,只要你不循环太多次或让它变得太大,那么你将开始得到舍入错误。一般来说,你可以想出办法来纠正这个问题,但是通过一个大小/范围的循环,这是一个无问题。
double d = 1.0;
for (unsigned i = 0; i <= 10; ++i, d += 0.1)
{
cout << d << endl;
}
如果你想避免加0.1的累积舍入误差,可以这样做:
double d = 10.0;
for (unsigned i = 0; i <= 10; ++i, d += 1.0)
{
cout << (d / 10.0) << endl;
}
这更准确,因为可以以浮点格式准确表示小整数。但是它会花费浮点除法,但仍然避免了int-to-float转换。
答案 4 :(得分:0)
for (double d = 1.0; d <= 2.02; d += 0.1)
{
cout << d << endl;
}
比较双倍是相等的是努力工作,但稍微增加就可以了。