Pull to refresh
0
0
Send message

Это распространённое заблуждение о том, как правильно сравнивать числа с плавающей точкой. Для критики такого сравнения - контрпример 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, которая определена вот так:

static inline bool qFuzzyCompare(double p1, double p2)
{
    return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}
static inline bool qFuzzyCompare(float p1, float p2)
{
    return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
}

А с некоторых пор, если возможно, стараюсь избегать сравнения чисел с плавающей точкой на равенство.

Сйечас идёт соревнование ботов для Go: http://theaigames.com/competitions/go
Не хотите поучаствовать, отладить бота?

Information

Rating
Does not participate
Registered
Activity