湛蓝之海 发表于 2021-12-28 17:15:04

C++精度计算问题

前言
在一次做(瞎)项(倒)目(腾)的经历中,发现了C++精度计算问题很复杂,害得我找了半天都没有找到这个错误,在学哥的帮助下最终找到了问题所在,特此记之。

代码
这是抽离出来的主要代码。
#include<iostream>
using namespace std;

void genAgent(int islandnum, int agentnum, float addagent)
{
int i=0;
for (int k = 0; k < islandnum; k++)//遍历每个island
{
    cout << agentnum * (islandnum + k * addagent) << "___" << agentnum * (islandnum + (k + 1) * addagent) << endl;
    for (i = agentnum * (islandnum + k * addagent); i < agentnum * (islandnum + (k + 1) * addagent); i++)//新增信息
    {

      cout << "我是i:" << i << endl;
    }
}
}

int main()
{
genAgent(4, 50, 0.2);
system("pause");
return 0;
}

结果

200___210
我是i:200
我是i:201
我是i:202
我是i:203
我是i:204
我是i:205
我是i:206
我是i:207
我是i:208
我是i:209
210___220
我是i:209
我是i:210
我是i:211
我是i:212
我是i:213
我是i:214
我是i:215
我是i:216
我是i:217
我是i:218
我是i:219
220___230
我是i:220
我是i:221
我是i:222
我是i:223
我是i:224
我是i:225
我是i:226
我是i:227
我是i:228
我是i:229
230___240
我是i:230
我是i:231
我是i:232
我是i:233
我是i:234
我是i:235
我是i:236
我是i:237
我是i:238
我是i:239
我是i:240   (问题所在)
请按任意键继续. . .



问题
我们可以轻易地看见"问题所在"的栏目是不应该存在的,也就是在最后一次循环中输出了11次(实际应该是10次)。

尝试
知道了问题所在,尝试都转​​flaot​​​、​​double​​​、以及​​向上取整​​​都出错了,最后尝试四舍五入​​round()​​函数解决问题,虽然这个解决办法有些简单,但是对于C++精度问题注定是一个陷阱!

改进

#include<iostream>
#include<math.h>
using namespace std;

void genAgent(int islandnum, int agentnum, float addagent)
{
int i=0;
for (int k = 0; k < islandnum; k++)//遍历每个island
{
    cout << agentnum * (islandnum + k * addagent) << "___" << agentnum * (islandnum + (k + 1) * addagent) << endl;
    for (i = round(agentnum * (islandnum + k * addagent)); i < round(agentnum * (islandnum + (k + 1) * addagent)); i++)//新增信息
    {

      cout << "我是i:" << i << endl;
    }
}
}

int main()
{
genAgent(4, 50, 0.2);
system("pause");
return 0;
}

结果

200___210
我是i:200
我是i:201
我是i:202
我是i:203
我是i:204
我是i:205
我是i:206
我是i:207
我是i:208
我是i:209
210___220
我是i:210
我是i:211
我是i:212
我是i:213
我是i:214
我是i:215
我是i:216
我是i:217
我是i:218
我是i:219
220___230
我是i:220
我是i:221
我是i:222
我是i:223
我是i:224
我是i:225
我是i:226
我是i:227
我是i:228
我是i:229
230___240
我是i:230
我是i:231
我是i:232
我是i:233
我是i:234
我是i:235
我是i:236
我是i:237
我是i:238
我是i:239
请按任意键继续. . .



总结
渐渐地应该明白C++的重要性吧,那就重新开始咯!ヾ(◍°∇°◍)ノ゙






https://blog.51cto.com/u_10975123/4851972
页: [1]
查看完整版本: C++精度计算问题