Почему C дает мне другой ответ, чем мой калькулятор? - PullRequest
4 голосов
/ 08 февраля 2010

У меня возникла странная проблема с этим кодом:

legibIndex = 206.385 - 84.6 * (countSylb / countWord) - 1.015 * (countWord / countSent);

Это вычисление для индекса читаемости данного текстового файла. Поскольку это домашнее задание, нам сказали, каким должен быть индекс (80 или точно 80,3)

Все мои слоги, слова и предложения верны (они совпадают с заданными числами для текстовых файлов образца.

Даже если я жестко закодирую числа, я не получу 80, хотя получаю, когда кладу их в свой калькулятор точно так, как видно. Я не могу себе представить, что не так.

Вот уравнение, которое нам дали:

Index = 206.835 - 84.6 * (# syllables/# words) - 1.015 * (# words/# sentences)

Как видите, я просто подключил свои переменные (которые содержат правильные значения. Для справки: 55 слогов, 40 слов, 4 предложения по заданию преподавателя. Значения, которые выдает моя программа при запуске, имеют индекс читаемости 112.

Мне не хватает скобок или как? Я в тупике!

Ответы [ 8 ]

9 голосов
/ 08 февраля 2010

Сразу же, по именам (которые включают слово count ), я бы предположил, что countSylb, countSent и countWord объявлены как целые числа, и поэтому ваши деления делать целочисленную арифметику, обрезая десятичные части. Примените их к поплавкам, и это должно исправить это.

legibIndex = 206.385 - 84.6 * ((float)countSylb / ((float)countWord) - 
               1.015 * (((float)countWord / ((float)countSent);
2 голосов
/ 08 февраля 2010

Возможно, у вас проблема с типом данных при округлении, потому что int / int = int вместо float.

Если вы разыгрываете float или объявляете его как float, это должно вам помочь.

1 голос
/ 08 февраля 2010

Если ваши вычисления в скобках являются чистыми целыми числами, то при вычислении будут удалены десятичные части и они будут округлены вниз (как при использовании floor ()), что, очевидно, изменит результат.

1 голос
/ 08 февраля 2010

Работает здесь. Возможно, вы делаете целочисленное деление вместо деления с плавающей запятой:

>>> def leg(syl, wor, sen):
...   return 206.835 - 84.6 * (float(syl) / wor) - 1.015 * (float(wor) / sen)
... 
>>> print leg(55, 40, 4)
80.36
0 голосов
/ 08 февраля 2010

Как указывалось выше, ваши переменные-счетчики, вероятно, являются целыми числами, но ваше выражение содержит буквенные числа с плавающей точкой Приведение этих целых в float даст правильное значение. Вы также должны убедиться, что результат, в котором вы храните результат выражения (legibIndex), также имеет тип float.

0 голосов
/ 08 февраля 2010

Я думаю, проблема в том, что (# слогов / # слов) равно 1, если вы используете целочисленную арифметику. Если вы убедитесь, что выполняете вычисления с использованием арифметики с плавающей запятой (например, # syllables / # words = 1.375), вы должны получить правильный ответ.

0 голосов
/ 08 февраля 2010

Когда я запускаю это в Haskell, я получаю правильный ответ (80.36000000000001).

0 голосов
/ 08 февраля 2010

Вероятно, это приоритет оператора . Чтобы быть уверенным, сгруппируйте вещи, которые, по вашему мнению, должны произойти в первую очередь больше, чем у вас уже есть.

Редактировать Нет, это не так; используя приоритет оператора C, я получаю 80,36. Я ожидаю, что sparks был прав (и первым не в курсе), что это проблема с типом данных, и вы столкнулись с преждевременным округлением.

...