Быстрое сравнение double с учетом не точностей.
От: Аноним  
Дата: 17.07.14 09:43
Оценка: +1 :))) :)

__forceinline bool fdcmp ( double v1, double v2, char o ) // v1 eq v2 
{
    return ( ( ((__int64)( (*(unsigned __int64 *)&v1) - (*(unsigned __int64 *)&v2))) ) & 0x7FFFFFFFFFFFFFFF )<= o ;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double p = 0.01;

//    for ( double v = 0.0; v < 2.0 ; v += p ){

    double v = 0.0;

    while ( v <= 200000.0 ){
        int i = (int)( v / p + 0.5); 
        double d1 = (i-1) * p;

        double d = d1 + p;
        
        if ( ! fdcmp ( v, d, 0 ) ){
            cout << "i=" << i << scientific << setprecision(60) << " v=" << v << scientific << setprecision(60) << " d=" << d << endl;
        }
        v = d;
        v = v + p;
    }
    
    return 0;
}



Функция быстрого сравнения двух даблов с учетом возможной ошибки и без усложнения с DBL_EPSILON приведением ее нужному порядку.

bool fdcmp ( double v1, double v2, char o );

Возвращает истину если величины равны и лож если не равны.

Параметры:

double v1 и v2 -- сравниваемые даблы
char o -- минимальное расхждение в числе едениц минимальной величины нормализованной разницы.
Ну на самом деле — тип тут может быть любой целый, как нравиться, знаковый или нет не важно, но это должно быть некое положительное число.


То есть в приведенном выше примере если вместо '0' поставить '1' то это как раз то что надо для сравнения.

То есть это та допустимая разница какая может быть из за ощибок преобразования и представления.
То есть все ставят тут '1'.

Код по быстродействию я так думаю будет даже быстрее чем просто сравнение даблов в языке '><='.

Всем спасибо.
хекспертам привет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.