LINUX.ORG.RU

[C++] сводящиая с ума странность при сравнении переменных

 


0

0

Есть код: (Все смотреть не обязательно - см. описание проблемы после кода.)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main(){

char codeN[20];
int start, end;
double sprava, K, len, codeNn, ostatok, perenosimoe, cleanChislo, endChislo;
ifstream in("code.in");
in >> codeN;
in >> K;
in.close();

len = strlen(codeN);
codeNn = atoi(codeN);
start = pow(double(10),double(len-1));
end = pow(double(10), double(len));

for (int i = start; i < end; i++){
sprava = len - K;
perenosimoe = int(i / pow(10,sprava));
ostatok =( i / pow(10,sprava) - int(i / pow(10,sprava)) ) * pow(10,sprava);
cleanChislo = ostatok * pow(10,K);
endChislo = cleanChislo + perenosimoe + i;
cout << "Ravny li " << endChislo << " i " << codeNn;

if ( codeNn == endChislo ) {
ofstream out("code.out");
out << i << endl;
out.close();
return 0;
}
}
return 0;
}

Ну так вот. codeNn из файла == 512, а K = 1;
Но это тоже не важно. Важно вот что:
Есть там строчка " cout << "Ravny li " << endChislo << " i " << codeNn; "
При одной из итераций она выводит: " Ravny li 512 i 512 ".
А затем программа нифига не завершается и в файл ничего не записывается. То бишь получается, что эти переменные не равны, хотя только что он их вывел и они явно (512 == 512) равны!

Вот как. Очень жду ответа. Всем заранее спасибо.


Переменные с плавающей точкой надо сравнивать так: if (fabs(n1 - n2) < EPS) { }

где EPS это маленькое число, например 1e-10 для double

можешь кстати сделать cout << (endChislo - codeNn) - думаю, поймёшь в чём тут дело.

Legioner ★★★★★
()
Ответ на: комментарий от kuz

> А где можно почитать, за что оно так?

глава 1 книжки Кобелькова и покойных Бахвалова и Жидкова

dilmah ★★★★★
()

> double sprava, K, len, codeNn, ostatok, perenosimoe, cleanChislo, endChislo;

codeNn и endChislo у тебя дробные, не нужно сравнивать на равенство дробные числа. используй неравенство при сравнении, или такой вариант "Если числоА равно ЧислуБ плюсминус точность Эпсилон то ..." ну или приводи до целого.

Eshkin_kot ★★
()

Ну ты и выдал!

double cleanChislo, endChislo; .... if ( codeNn == endChislo ) {

Да ведь числа с плавающей точкой сравнивать операцией == вообще нельзя! Всегда будет разница в виде ошибок округления. В этом случае надо брать модуль разности чисел и выяснять, меньше ли он какого-либо малого числа, зависящего от точности вычислений. Например, if ( abs(codeNn - endChislo ) < 0.000001 ) {

Либо, если интересуют целые значения - приводить все к целым.

Например, if ( (int)codeNn == (int)endChislo ) {

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.