Боян, блин...
Не, это не тот баян. В ссылке указывается на потерю точности в ходе преобразований, что потребует перед сравнением снижать точность обоих чисел до требуемого числа бит, иначе он различит одно и то же число, как два разных.
У меня задача сравнения с нулём, например, вычисляем функцию y(x) = A + B / x. При x == 0 будет деление на ноль, и его нужно избежать. Как в этом случае отработать? В случае вычисления пределов часто появляется -0. Как быть здесь?
в Qt даже отдельную функцию добавили qFuzzyCompare
Кстати:
bool qFuzzyCompare(double p1, double p2)
Compares the floating point value p1 and p2 and returns true if they are considered equal, otherwise false.
Note that comparing values where either p1 or p2 is 0.0 will not work, nor does comparing values where one of the values is NaN or infinity. If one of the values is always 0.0, use qFuzzyIsNull instead. If one of the values is likely to be 0.0, one solution is to add 1.0 to both values.
bool qFuzzyIsNull(double d)
Returns true if the absolute value of d is within 0.000000000001 of 0.0.
Не совсем понял: зачем их вообще ввели, ведь точность может быть хуже и сравнивать нужно с большим её срезом.
Итак, небольшой тест:
#include <stdio.h>
int main(int argc, char* argv[]) {
char pcPlusZero[8] = {0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x00};
char pcMinusZero[8] = {0x00, 0x00, 0x00, 0x00, \
0x00, 0x00, 0x00, 0x80};
double* pdPlusZero = (double*)pcPlusZero;
double* pdMinusZero = (double*)pcMinusZero;
printf("Plus zero: %f\n", *pdPlusZero);
printf("Minus zero: %f\n", *pdMinusZero);
if (*pdPlusZero == (double)0.) printf("Test 1: Plus zero equal zero.\n");
if (*pdMinusZero == (double)0.) printf("Test 2: Minus zero equal zero.\n");
if (*pdPlusZero == *pdMinusZero) printf("Test 3: Plus zero equal Minus zero.\n");
if (*pdPlusZero) printf("Test 4: Plus zero is not \"zero\".\n");
if (*pdMinusZero) printf("Test 5: Minus zero is not \"zero\".\n");
if (!*pdPlusZero) printf("Test 6: Plus zero is \"zero\".\n");
if (!*pdMinusZero) printf("Test 7: Minus zero is \"zero\".\n");
if (*pdPlusZero == (double)1.) printf("Test 8: Plus zero equal 1.\n");
if (*pdMinusZero == (double)1.) printf("Test 9: Minus zero equal 1.\n");
long long* pllPlusZero = (long long*)pcPlusZero;
if (*pllPlusZero) printf("Test 10: Long long plus zero is not \"zero\".\n");
long long* pllMinusZero = (long long*)pcMinusZero;
if (*pllMinusZero) printf("Test 11: Long long minus zero is not \"zero\".\n");
return 0;
}
Результат:
Plus zero: 0.000000
Minus zero: -0.000000
Test 1: Plus zero equal zero.
Test 2: Minus zero equal zero.
Test 3: Plus zero equal Minus zero.
Test 6: Plus zero is "zero".
Test 7: Minus zero is "zero".
Test 11: Long long minus zero is not "zero".