__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'.
Код по быстродействию я так думаю будет даже быстрее чем просто сравнение даблов в языке '><='.
Всем спасибо.
хекспертам привет.