2016-02-26 2 views
0

Всякий раз, когда я вводил число в этой программе, программа возвращает значение, которое на 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); 

} 

enter image description here

+0

int int int int – user3528438

+3

Вы имеете в виду, что когда вы вводите «2», результат равен «24»? – Ctx

+0

@ user3528438 - это то, что «int? –

ответ

0

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

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

+1

Учитывая, что ожидается, что «double» будет иметь ~ 53 бит точности, а 'int' обычно имеет только 32 бита, причина не в самом преобразовании, а скорее в неточности в алгоритме' pow(). – EOF

2

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

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

Если это прекрасно, тогда проблем нет, конверсия является точной.

Если нет:

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

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

решение:

Изменить переход на «круглый до ближайшего целого числа» с помощью rounding functions

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

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

0

Если вам нужны точные результаты для больших чисел, вы должны использовать произвольную математическую математику точности, такую ​​как 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; 
} 
Смежные вопросы