Почему эти круглые скобки дают разные ответы в C? - PullRequest
2 голосов
/ 06 мая 2020

Я работал над удобочитаемостью для CS50 PS 2 и получал неверные результаты об уровне обучения.

Отладка показала, что входные значения были правильными, но выходные были неправильными. Ручной расчет с использованием входных данных дал правильный ответ.

Я упростил первую часть уравнения и нашел следующее:

Используя значения 214 для L и 56 для W, выражение:

float R = (0.0588 * (L / W) * 100);

выводит 17.64, что неверно.

Когда я использую:

float R = (0.0588 * L / W * 100);

, выводится 22.47, что правильно.

Не могу понять почему.

Ответы [ 2 ]

4 голосов
/ 06 мая 2020

Выражение

float R = (0.0588 * (L / W) * 100);

преобразуется в

float R = 0,0588 * 3 * 100;

, что составляет 17.64 при округлении до двух десятичных знаков.

Результат L / W целочисленное деление - это int, поэтому результат 3.8... будет усечен до 3.

Чтобы исправить это, по крайней мере одна из переменных W или L должна иметь тип float или double.

Выражение

float R = (0.0588 * L / W * 100);

преобразуется в

float R = ((0,0588 * 214) / 24) * 100 //parenthesis to illustrate the sequence 

, что дает правильный результат 22.47 при округлении до двух десятичных знаков.

3 голосов
/ 06 мая 2020

Велика вероятность, что и L, и W объявлены как int. Тогда в первом случае (L/W) также будет рассматриваться как int и, следовательно, будет закрыто, что вызывает ошибку.

Примечание: даже если они объявлены float или double , арифметика с плавающей запятой означает, что умножение и деление не ассоциативны.

...