Правильно ли я делю на C? - PullRequest
       16

Правильно ли я делю на C?

2 голосов
/ 05 апреля 2020

Мне нужно применить формулу к трем переменным. Некоторые операции (подразделения) дают мне 0 вместо правильного числа. Таким образом, я получаю другой результат от того, что я ожидал от формулы.

Я думаю, что проблема связана с тем, как C управляет типами данных и их остатками. По этой причине я пытался преобразовать переменные типа int в переменные типа float или округлить числа, которые я разделил. Но все это все еще не работает, и я не могу понять, что мне не хватает.

Не могли бы вы взглянуть на мой код и сообщить мне, где ошибка? Спасибо

double grade(int lc, int wc, int sc)
{
    wc = (float)wc;
    lc = (float)lc;
    sc = (float)sc;
    float L = round((wc/100)/lc);
    float S = round((wc/100)/sc);
    float index = 0.0588 * L - 0.296 * S - 15.8;
    return index;
}

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020

Или просто сделайте это (другим операндам не понадобится приведение к float, так как достаточно, если это только один из операндов, тогда остальные будут преобразованы в него неявно)

double grade(int lc, int wc, int sc)
{
    float L = round(((float)wc/100)/lc);
    float S = round(((float)wc/100)/sc);
    float index = 0.0588 * L - 0.296 * S - 15.8;
    return index;
}

Обратите внимание, что тип возвращаемого значения double, но вы используете только float с. Используйте double вместо float s в функции в качестве типов ИЛИ измените тип возвращаемого значения на float.

Ошибка состоит в том, что этот wc = (float)wc; по сути такой wc = (int)(float)wc;, поскольку wc тип int. По сути, ничего не происходит, поэтому, когда вы выполняете вычисления как wc/100, тогда это будет целочисленное деление, результатом которого будет целое число, поэтому, если wc меньше 100 (и> = 0), то результат равен 0, а не действительное число, как и следовало ожидать.

2 голосов
/ 05 апреля 2020
  • wc = (float)wc; приводит int к float, преобразует обратно в int, затем присваивает. Здесь нет реальной выгоды.

  • wc/100 - это целочисленное деление, которое отбрасывает дробное отношение. Маловероятно, что хочет ОП.

  • Преобразование int в float может привести к потере точности, так что ответ будет менее точным. double лучше для широкого диапазона значений int.

  • Код смешивает использование float и double с вызовом умножения double round(double), double и преобразования из float в double в float в double. Упростите и используйте double повсюду.


double grade(int lc, int wc, int sc) {
    //               v------v `double` division 
    double L = round(wc/100.0/lc);
    double S = round(wc/100.0/sc);
    return 0.0588 * L - 0.296 * S - 15.8;
}
2 голосов
/ 05 апреля 2020

Проблема:

wc = (float)wc;
lc = (float)lc;
sc = (float)sc;

Все эти утверждения не делают то, что вы думаете, потому что типы этих переменных изначально int.

Вы преобразовываете от int до float и присвоение его обратно int.

Решение:

Передайте значения в float вместо int для функции неявное преобразование позаботится обо всем остальном.

Измените сигнатуру вашей функции на

double grade(float lc, float wc, float sc)

...