Dale,
1 )подскажи, как уговорить коллегу не пользоваться memcmp , а применять точность при сравнении ?
Например, вспомнить, что доброе слово и пистолет всегда убедительнее, чем доброе слово... Если серьезно, то, если человек не знает самых азов, убедить будет проблематично.
Ведь, по сути, если байты одинаковые, то и числа одинаковые - как я могу это опровергнуть
Хотя бы тот факт, что стандарт IEEE 754 допускает два представления нуля:
00 00 00 00 = +0
80 00 00 00 = -0
Побитовое сравнение скажет, что положительный и отрицительный нули не равны, что есть нонсенс.
2) и всё-таки, про пост #1 можно комментарии ?
Небольшой этюд на тему чисел с плавающей точкой:
#include <stdio.h>
int main(void)
{
double a = 17.0;
double b = 13.0;
double c = a / b;
double d = 0.0;
for (int i = 0; i < 13; i++)
d += c;
double e = d - a;
printf("%25.18e %25.18e %25.18e %25.18e %25.18e\n", a, b, c, d, e);
return 0;
}
Результат высполнения кода:
1.700000000000000000e+001 1.300000000000000000e+001 1.307692307692307700e+000 1.700000000000000400e+001 3.552713678800500900e-015
Делим 17 на 13, затем результат складываем с самим собой 13 раз - и получаем число, отличающееся от исходного на небольшую, но тем не менее ненулевую величину. Арифметика утверждает, что результаты должны быть равны, программа - что это разные числа (если сравнивать побитно).
На практике числа, отличающиеся в 16-м знаке после точки, в большинстве приложений разумно считать равными (есть исключения, например, в случае научных расчетов при плохой сходимости, но это скорее экзотика, вряд ли Ваша задача из таких).