Степенная функция возвращает на 1 результат меньше

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

#include<stdio.h>
#include<math.h>
 int main(void)
 {
     int a,b,c,n;

     scanf("%d",&n);

     c=pow((5),(n));

    printf("%d",c);

 }

введите здесь описание изображения


person Toufiqul Islam Dipto    schedule 26.02.2016    source источник
comment
Вы имеете в виду, что когда вы вводите 2, результат равен 24?   -  person Ctx    schedule 26.02.2016
comment
@user3528438 user3528438 это 'int?   -  person Martin James    schedule 26.02.2016
comment
@MartinJames минимальная длина комментария....   -  person user3528438    schedule 26.02.2016
comment
Чтобы получить хороший ответ, лучше опубликовать фактические используемые значения и наблюдаемые результаты.   -  person chux - Reinstate Monica    schedule 26.02.2016


Ответы (3)


pow() возвращает double, неявное преобразование из double в int "округляет до нуля".

Так что это зависит от поведения функции pow().

Если это идеально, то нет проблем, преобразование точное.

Если не:

1) результат чуть больше, то конвертация округлит его до ожидаемого значения в меньшую сторону.

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

решение:

Измените преобразование на "округление до ближайшего целого" с помощью функций округления.

c=lround(pow((5),(n)));

В этом случае, пока pow() имеет ошибку менее +-0,5, вы получите ожидаемый результат.

person user3528438    schedule 26.02.2016

pow() принимает double аргументов и возвращает double.

Если вы сохраните возвращаемое значение в int и распечатаете его, вы можете не получить желаемого результата.

person Sourav Ghosh    schedule 26.02.2016
comment
Учитывая, что double может иметь точность ~53 бита, а int обычно имеет только 32 бита, причина не в самом преобразовании, а скорее в неточности алгоритма pow(). - person EOF; 26.02.2016

Если вам нужны точные результаты для больших чисел, вам следует использовать математическую библиотеку произвольной точности, например GMP. Это просто:

#include <stdio.h>
#include <math.h>
#include <gmp.h>

int main(void) {
    int n;
    mpz_t c;

    scanf("%d",&n);
    mpz_ui_pow_ui(c, 5, n);
    gmp_printf("%Zd\n", c);

    return 0;
}
person Ctx    schedule 26.02.2016