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次)。

嘗試

知道了問題所在,嘗試都轉flaotdouble、以及向上取整都出錯了,最後嘗試四捨五入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++的重要性吧,那就重新開始咯!ヾ(◍°∇°◍)ノ゙

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章