有以下一段代码:
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 5 int main() 6 { 7 int M; 8 cin>>M; 9 for(int i = 0; i < pow(M, 3); i++) 10 { 11 cout << i << ' '; 12 } 13 cout<<endl; 14 return 0; 15 }
在VS2015和GCC两种环境下执行结果竟然不同!
GCC: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
VS2015: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
即GCC执行第9-12行的循环时要比VS2015多一次。
请问这是什么原因?按道理 i=27 时执行循环的条件语句应该已经不符合了才对,但是GCC还能执行一次循环体?
#include <iostream> #include <cmath> using namespace std; int main() { int M; cin>>M; int times = pow(M,3); cout << "times: " << times; for(int i = 0; i < times; i++) { cout << i << ' '; } cout<<endl; return 0; }
这样一目了然了. 在判断的时候, 尽量不要引入可变的东西.
解决方法是早就知道的,我想知道产生不同结果的根本原因
pow()返回类型是double, 循环计数i与 pow()比较的时候将被转换为两个double比较,于是就出现了边界问题。
通常用 |double1 - double2| < 0.0000001去判断两个double相等,你上面的代码应该将double强制转换为int