Это распространённое заблуждение о том, как правильно сравнивать числа с плавающей точкой. Для критики такого сравнения - контрпример c малыми числами, между которыми помещается довольно много представимых значений double:
#include <float.h>
#include <math.h>
#include <stdio.h>
int main() {
double a = 1e-16;
double b = 2e-16;
if (a == b)
printf("a == b"); // это условие не выполняется
if (fabs(a - b) <= DBL_EPSILON)
printf("fabs(a - b) <= DBL_EPSILON"); // это выполняется
}
Как корректно сравнивать, зависит от того, что значит "корректно". Некоторые варианты можно посмотреть, например, здесь.
Когда писал на Qt, использовал функцию qFuzzyCompare, которая определена вот так:
Это распространённое заблуждение о том, как правильно сравнивать числа с плавающей точкой. Для критики такого сравнения - контрпример c малыми числами, между которыми помещается довольно много представимых значений double:
Как корректно сравнивать, зависит от того, что значит "корректно". Некоторые варианты можно посмотреть, например, здесь.
Когда писал на Qt, использовал функцию qFuzzyCompare, которая определена вот так:
А с некоторых пор, если возможно, стараюсь избегать сравнения чисел с плавающей точкой на равенство.
Сйечас идёт соревнование ботов для Go: http://theaigames.com/competitions/go
Не хотите поучаствовать, отладить бота?