Я хочу знать, как я могу вычислить процент, пока я читаю данные из потока файлов. Я пробовал этот путь, и все, что я получаю, равно нулю
typedef struct Counter{
int range1,range2,range3,range4;
double preset1 ,preset2 ,preset3 ,preset4;
} countType;
void analysis_range(double d, countType &ctp) {
// from 0 to 1.00 KM
if (d >= 0.00 && d <= 1.00) {
ctp.range1 += 1;
ctp.preset1 = ((ctp.range1 / (ctp.range1 + ctp.range2 + ctp.range3 +
ctp.range4)));
}
// from 1.00 to 2.00 KM
else if (d > 1.00 && d <= 2.00) {
ctp.range2 += 1;
ctp.preset2 = ((ctp.range2 / (ctp.range1 + ctp.range2 + ctp.range3 +
ctp.range4))) *
10;
}
// from 1.00 to 2.00 KM
else if (d > 2.00 && d <= 5.00) {
ctp.range3 += 1;
ctp.preset3 = ((ctp.range3 / (ctp.range1 + ctp.range2 + ctp.range3 +
ctp.range4))) *
10;
}
// grater than 5.00 KM
else if (d > 5.00) {
ctp.range4 += 1;
ctp.preset4 = ((ctp.range4 / (ctp.range1 + ctp.range2 + ctp.range3 +
ctp.range4))) *
10;
}
}
void ProcesData(int rank, int numProcs) {
static countType count;
MPI_Datatype recType = createRecType();
// read file and populate the vectors
ifstream foodbankFile("foodbanks.dat");
ifstream residenceFile("residences.dat");
// populate datavector
std::vector<Foodbank> foodbankData(
(std::istream_iterator<Foodbank>(foodbankFile)),
std::istream_iterator<Foodbank>());
Residence res;
int numLines = 0;
while (!residenceFile.eof()) {
residenceFile >> res.x >> res.y;
if (numLines % numProcs == rank) {
// call the process
// populate_distancesVector(res,foodbankData);
analysis_range(populate_distancesVector(res, foodbankData),
count);
}
++numLines;
}
std::cout << "for Rank" << rank << ",from 0 to 1.00 KM:" << count.range1
<< ",%" << count.preset1
<< ",from 1.00 to 2.00 KM:" << count.range2 << ",%"
<< count.preset2 << ",from 2.00 to 5.00 KM:" << count.range3
<< ",%" << count.preset3
<< ",grater than 5.00 KM:" << count.range4 << ",%"
<< count.preset3 << std::endl;
}
Вероятно, вы получаете нуль, потому что ctp.range1 в ctp.range4 не являются значениями с плавающей запятой. Если вы разделите целое число на целое число, результат также станет целым. Включите один из операндов, чтобы поплавать или удвоить, например:
ctp.preset1 = (((float) ctp.range1/(ctp.range1+ctp.range2+ctp.range3+ctp.range4)));
ctp.range1
не является float
? o__O
Итак, я понимаю, что ctp.preset1 предполагает удерживать процент для диапазона 1, основываясь на счете в ctp.range1.
Причина, по которой вы носите нуль, если вы используете целые числа, в этой части уравнения:
(ctp.range1/(ctp.range1+ctp.range2+ctp.range3+ctp.range4))
Это всегда будет оцениваться до нуля для значимых значений диапазона, поскольку целые математические вычисления усекаются. Измените его на:
(ctp.range1/double(ctp.range1+ctp.range2+ctp.range3+ctp.range4))
и все должно быть хорошо.