Ниже приведена функция, которую я пытаюсь использовать, чтобы решить, переместил ли игрок шашки вверх или вправо. moveTo
содержит десятичное число, подобное 5.2, а moveFrom
будет содержать квадратное число 6.3, разница будет -1.1 и назначена moveValue
(я проверяю ее с помощью оператора trace и правильно присваивает).
однако, когда он попадает в ifs, он не выходит как равный, и поэтому он запускает последний оператор if, однако, если я жестко кодирую -1.1 для moveValue
он правильно оценивает. Любые идеи, почему это не правильно оценивается, будут большой помощью. Я опубликовал вывод о запуске программы под кодом:
int legalPlayerMove(float moveTo, float moveFrom)
{
float moveValue=(moveTo-moveFrom);
cout<<"trace move value"<<moveValue<<endl;
if(moveValue==(-1.1))
cout<<"moved up left"<<endl;
if(moveValue==(-0.9))
cout<<"moved up right"<<endl;
if(moveValue!=-1.1||moveValue!=-.9)
cout<<"that is not a legal move, please renter the square number you wish to move to."<<endl;
return 0;
}
Всегда проблематично сравнивать переменные float
или double
с точными значениями float
или double
literal! Также использование operator==
не является хорошей идеей в целом.
Используйте сравнение вместо минимальной разницы (aka epsilon) значений:
if(std::numeric_limits<float>::epsilon() + moveValue > 1.1) { // ...
}
Добавляя к сказанному, точное представление 0,1 или его кратность в двоичном выражении отсутствует. Это бесконечный ряд степеней 2.
Нет никакой гарантии, что компилятор будет округлять ваши постоянные значения точно так же, как библиотека времени выполнения округляет входное значение.
Вы должны использовать целые пары для того, что вы делаете.
Вам неловко смешивать текстовое представление числа с его неотъемлемым значением.
#define EPS 0.000001
if(EPS + moveValue > 1.1){..}
...