首页 新闻 会员 周边

C++的pow函数的奇怪问题

0
悬赏园豆:5 [已关闭问题] 关闭于 2017-08-24 13:48

有以下一段代码:

 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还能执行一次循环体?

飞鸟_Asuka的主页 飞鸟_Asuka | 菜鸟二级 | 园豆:209
提问于:2016-10-13 15:34
< >
分享
所有回答(2)
0
#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;
}

这样一目了然了. 在判断的时候, 尽量不要引入可变的东西.

[0] | 园豆:1257 (小虾三级) | 2016-10-13 21:18

解决方法是早就知道的,我想知道产生不同结果的根本原因

支持(0) 反对(0) 飞鸟_Asuka | 园豆:209 (菜鸟二级) | 2016-10-13 22:30
0

pow()返回类型是double, 循环计数i与 pow()比较的时候将被转换为两个double比较,于是就出现了边界问题。

通常用 |double1 - double2| < 0.0000001去判断两个double相等,你上面的代码应该将double强制转换为int

灵枢 | 园豆:297 (菜鸟二级) | 2016-10-14 13:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册