for循环的问题(初学者)
Trouble with the for loop (Beginner)
我开始学习c++,我得到了这个简单的程序:(我提前为我的英语道歉)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
vector<double> time_vector(int interval[], float increment)
{
vector<double> time;
for (double i=interval[0]; i<=interval[1]; i=i+increment)
time.push_back(i);
return time;
}
int main(int argc, char** argv) {
int interval[] = {0,3};
float increment = 0.1;
vector<double> time = time_vector(interval, increment);
for (vector<double>::iterator it=time.begin(); it!=time.end(); ++it)
cout << *it << " ";
return 0;
}
time_vector函数的思想是创建一个范围为[a,b]的向量,并以一个增量值自增。这将模拟来自matlab
的命令a:increment:b
但是当我运行它时,我得到这个:
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 0
可以看到,最后一个元素不是3.0,而它应该是3.0。我这样做对吗?
很可能是浮点精度问题。参见浮点指南(每个程序员都应该知道的浮点算术)
因此0.1
在IEEE754中不能完全表示。
p。这不是c++本身的问题。在C、Ada或Fortran中也会遇到同样的问题。
这个问题与内部浮点表示有关:在for循环的最后一个循环中可能会发生以下情况
i = 2.9000000432133675
increment = 0.100000001
i + increment = 3.0000000442133675
因此,条件不再满足,您将不会存储最后期望的结果。
你可能想在你的结果中添加一个epsilon值以确保正确性,例如
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define EPSILON 0.0000001
vector<double> time_vector(int interval[], float increment)
{
vector<double> time;
for (double i=interval[0]; i<=interval[1] + EPSILON; i=i+increment)
time.push_back(i);
return time;
}
int main(int argc, char** argv) {
int interval[] = {0,3};
float increment = 0.1f;
vector<double> time = time_vector(interval, increment);
for (vector<double>::iterator it=time.begin(); it!=time.end(); ++it)
cout << *it << " ";
return 0;
}
http://ideone.com/WRi2ln Nb。这并不意味着c++ 不如Matlab精确。Matlab内部处理所有这些技巧和权衡,但只是使它对您不透明,让您专注于其他事情(c++允许您做更多低级别的东西,但这是您为此付出的代价)。
由于浮点表示和您构建循环的方式,无法保证vector中存在范围内的最后一个数字。避免这种情况的一种方法是计算所需的步数来生成所需的范围并执行计算,如下所示:
std::vector<double> time_vector(int interval[], float increment)
{
std::vector<double> time;
int nSteps = (int)((interval[1] - interval[0]) / increment + 0.5f); //Rounding
time.push_back(interval[0]);
for (int i = 1; i <= nSteps; ++i)
{
time.push_back(interval[0] + i * increment);
}
return time;
}
我注意到你在double、float和int之间做了很多隐式强制转换。而不是将间隔存储为两个整型,而是尝试将其存储为浮点数,您也可以将时间向量中的值增加一个浮点数,尽管它们存储为双精度。尝试使用统一类型,以便有列表隐式转换:
vector<float> time_vector(float interval[], float increment)
{
vector<float> time;
for (float i=interval[0]; i<=interval[1]; i=i+increment)
time.push_back(i);
return time;
}
int main(int argc, char** argv) {
float interval[] = {0,3};
float increment = 0.1;
vector<float> time = time_vector(interval, increment);
for (vector<float>::iterator it=time.begin(); it!=time.end(); ++it)
cout << *it << " ";
return 0;
}
相关文章:
- 嵌套for循环C++的问题(初学者)
- 初学者问题:如何使用这些晦涩难懂的命令,例如C++中的'RenderWindow'
- 初学者问题:如何访问此变量?
- 您好,我是C++初学者,有这种问题.它给了我倍增的错误
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 初学者关于数组和指针的问题
- 模板编程初学者问题
- 在 Rcpp-Function 中使用布尔向量的子集(Rcpp 初学者的问题..)
- 我在C 初学者中发现了无限的循环问题
- 在C 中的初学者,我面临此问题错误C3867
- 有关循环冗余代码的初学者问题
- 初学者问题 - 致命错误LNK1561:必须定义入口点
- 关于编译器错误的初学者问题
- C++ 的初学者问题
- C++ 移动黑白函数的初学者问题
- 2个关于c++的初学者问题
- Qt C++简单的应用程序初学者问题
- 初学者问题:当对象位于向量中时,为什么我无法访问对象的成员?
- 如何使用这个 C++ 模板函数.简单的初学者问题
- 初学者问题生成文件不起作用