возвращаемое значение pow () округляется в меньшую сторону, если оно присваивается целому числу - PullRequest
6 голосов
/ 29 октября 2011

Я использую функцию pow в C и сохраняю возвращаемое значение в целочисленном виде.см. фрагмент кода ниже:

for (i = 0; i < 5; i++){
    val = (int)pow(5, i);
    printf("%d, ", val);
}

здесь i, а val - целые числа, и результат равен 1, 5, 24, 124, 624.Я полагаю, что это потому, что число с плавающей точкой 25 рассматривается как 24.99999 ... который округляется до 24 при присваивании целому числу.

Как я могу пропустить это, если мне все еще нужно сохранить возвращаемое значение вint?

Ответы [ 4 ]

9 голосов
/ 29 октября 2011

Добавьте 0.5 перед приведением к int.Если ваша система поддерживает это, вы можете вызвать функцию C99 round(), но я предпочитаю избегать ее по причинам переносимости.

5 голосов
/ 29 октября 2011

заменить

val = (int)pow(5, i);

на

double d = pow(5,i);
val = (int)((d > 0.0) ? floor(d + 0.5) : ceil(d - 0.5));
3 голосов
/ 29 октября 2011

Реализуйте себя самостоятельно.

int myPow(int base, int exponent) {
    int n = 1;
    for (int i = 0; i < exponent; i++) {
        n *= base;
    }
    return n;
}

Это, конечно, работает только с положительными показателями и работает только с целыми числами, и, безусловно, есть более эффективные способы сделать это. См., Например, источник для ^ в Haskell .

0 голосов
/ 24 ноября 2013

У меня была эта проблема, я сам.Я решил это легко в вашей инструкции, просто добавив оператор if.

if (k%n>0)
{
    k=k+1;
}
...