Вот есть учебный код вычисления корней уравнения. Все числа объявлены как double => я ожидаю, что в результате деления они будут вести себя как double и в итоге также получится double. Однако, будучи записаны в едином выражении, они ведут себя странно.
double A = 2;
double B = 5;
double C = 2;
double D = -1;
D = B*B - 4*A*C;
double x1 = 0;
double x2 = 0;
x1 = (-B + sqrt(D)) / 2*A; // Ожидаю -0.5, получаю -2
x2 = (-B - sqrt(D)) / 2*A; // Ожидаю -2, получаю -8
// С помощью дополнительных ухищрений все же получается -0.5 и -2
double tmp = sqrt(D);
double tmp1 = (-B + tmp);
double tmp2 = 2 * A;
x1 = tmp1 / tmp2;
tmp1 = (-B - tmp);
tmp2 = 2 * A;
x2 = tmp1 / tmp2;
То есть, как видите, x1 = (-B + sqrt(D)) / 2*A вычисляется неправильно, но если числитель и знаменатель предварительно поместить в отдельные переменные, то все нормально. Почему так?