• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Red_Beret

[Resolvido] Potências em C

23 mensagens neste tópico

Hey

Alguem sabe se ha alguma livraria em C que permita calcular potencias?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponho que não existe nenhuma biblioteca que permita colocar potências. Acho que consegues fazer isso com um pedaço de código. ;) (depende do efeito que realmente pretendes é claro...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponho q uma operação do tipo: 2 ^ 3 vai dar 8 ...experimenta com o ^ a ver se funciona em C ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Suponho que não existe nenhuma biblioteca que permita colocar potências. Acho que consegues fazer isso com um pedaço de código. :) (depende do efeito que realmente pretendes é claro...)

:eek:

existe!!! na biblioteca de math!!!! math!!!!  :-[ lolololo

usa a funcao pow(x, n)  é equvalente a x^n  :thumbsup:

claro que podes implementar a tua propria funcao... tipo

int pot(int x, int n){
int i, p=1;
for(i=0; i<n;i++)
{ p=p*x;}
return p;
}

bem fiz a pressao...mas  é algo do genero...  ;)

e nunca se esquece ..se tiver a ver com matematica esta na biblioteca math.h  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou entao tb podes fazer assim:

Ex: queres X elevado ao 3

fazes x*x*x

Penso eu de que

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou entao tb podes fazer assim:

Ex: queres X elevado ao 3

fazes x*x*x

Penso eu de que

Mas para isso seria necessário que houvesse uma constante no expoente.

Imagina que ele quer que o expoente seja 1, 2, 3, 4, 5, 6, 7, 8, 9, etc etc etc

Da forma que indicas ele teria que andar a fazer testes para analisar qual seria o expoente.

Do tipo:

If expoente = 1

  y = x

else if expoente = 2

  y = x*x

else if expoente = 3

  y = x*x*x

else if expoente = 4

...

...

...

Percebeste o porquê dessa tua solução não ser muito válida ?

Cumps []

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou entao tb podes fazer assim:

Ex: queres X elevado ao 3

fazes x*x*x

Penso eu de que

Mas para isso seria necessário que houvesse uma constante no expoente.

Imagina que ele quer que o expoente seja 1, 2, 3, 4, 5, 6, 7, 8, 9, etc etc etc

Da forma que indicas ele teria que andar a fazer testes para analisar qual seria o expoente.

Do tipo:

If expoente = 1

  y = x

else if expoente = 2

  y = x*x

else if expoente = 3

  y = x*x*x

else if expoente = 4

...

...

...

Percebeste o porquê dessa tua solução não ser muito válida ?

Cumps []

essa maneira seria primitiva e nao daria bom resultados.... tipo x^100 ... terias qtos if??  :) pois...

o melhor é usar a funcao pow (x, n); ja esta defenida... ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

existe!!! na biblioteca de math!!!! math!!!!  :-[ lolololo

usa a funcao pow(x, n)  é equvalente a x^n  :thumbsup:

tks. era mesmo isso

Ou entao tb podes fazer assim:

Ex: queres X elevado ao 3

fazes x*x*x

Penso eu de que

pois... mas neste caso não dava dessa maneira.

o exercicio era este

capturaecra4oi.png

com esse método, daria bue trabalho. Assim, foram só 4 linhas de código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa.... complicado ????  :eek: conforme o ponto de vista....

double TIR(double I, double t, int n){
double tir=0;
int i;
for(i=0; i<n; i++){ tir=tir + I + I*pow(1+t,-i); }

return tir;

}

ve este topico bue antigo...k explica 1 funcao deste tipo.... isso é 1 serie ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tofas, duas notas (aka, dois erros);

* o for é de 0 a n, inclusive

* em tir = tir + I + I * pow... ; o I é somado a mais, basta "tir += I / pow(1+t, i);"

Mas a ideia é essa ;-)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

desculpa.... complicado ????  :eek: conforme o ponto de vista....

double TIR(double I, double t, int n){
double tir=0;
int i;
for(i=0; i<n; i++){ tir=tir + I + I*pow(1+t,-i); }

return tir;

}

ve este topico bue antigo...k explica 1 funcao deste tipo.... isso é 1 serie ;)

Ya, é uma serie. :)

Mas dessa maneira que tu fizeste, não é uma função recursiva. (acho eu)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para passar do algoritmo iterativo para recursivo basta trocar o "for" por "if + return", mas normalmente o objectivo é converter as coisas recursivas em iterativas, onde esta simplicação só pode acontecer em casos... ergh... simples. Como a tail-recursion aqui presente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tofas, duas notas (aka, dois erros);

* o for é de 0 a n, inclusive

* em tir = tir + I + I * pow... ; o I é somado a mais, basta "tir += I / pow(1+t, i);"

Mas a ideia é essa ;-)

sim isso...  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, para quem não sabe o operador ^ em C faz o XOR binário entre 2 valores :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas.. é o meu 1º post, tou a gostar muito do forum :)

Para o caso,podem usar o pow da math, mas se quiserem fazer um programa mais eficiente dêm uma olhadela a este site:

http://www.algorithmist.com/index.php/Repeated_Squaring

Aconcelho vivamente este site, tem coisas muito interessantes.

é bem...mas para quem esteje a iniciar, nesta area e nao esteje mto a vontade com  math, uiui, nao percebe o k esta nakele codigo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O pow() da libmath é mais eficiente que o "repeat squaring" e funciona para qualquer tipo de expoente. Em x^y, o y pode ser não inteiro, e aí todos os algoritmos que consistem em multiplicar x um dado número de vezes, simplesmente não funcionam. A maior dos algoritmos de potenciação são baseados em cáculo de logaritmos com posterior expansão a série de taylor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O pow() da libmath é mais eficiente que o "repeat squaring" e funciona para qualquer tipo de expoente. Em x^y, o y pode ser não inteiro, e aí todos os algoritmos que consistem em multiplicar x um dado número de vezes, simplesmente não funcionam. A maior dos algoritmos de potenciação são baseados em cáculo de logaritmos com posterior expansão a série de taylor.

O pow () tem um problema que é a precisão. Este facto é preocupante quando temos um expoente inteiro.

Há 3 dias no concurso de programação da U.P. queria calcular os cubos de uns números e colocar num array. Em vez de fazer simplesmente num*num*num , decidi usar o pow(). Acontece que perdi imenso tempo no concurso porque o arredondamento do pow() em 27 numeros havia um que calculava mal... exemplo: 19^3 dar 6858 em vez de 6859.

De facto, se calculares simplesmente:  pow(19,3) ele dá o número correcto, mas o arredondamento não funciona.. no ciclo a calcular os 27 primos falha sempre nesse:

for (i=0 ; i<=b ; i++) // b neste caso seria 27  e "v" um array de long's

        v[++nv]= (long) pow(i,3);

Não sei porque é k arredonda mal apenas no 19 (destes 27), visto que a parte fraccionária é sempre 0.

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O pow() da libmath é mais eficiente que o "repeat squaring" e funciona para qualquer tipo de expoente. Em x^y, o y pode ser não inteiro, e aí todos os algoritmos que consistem em multiplicar x um dado número de vezes, simplesmente não funcionam. A maior dos algoritmos de potenciação são baseados em cáculo de logaritmos com posterior expansão a série de taylor.

O pow () tem um problema que é a precisão. Este facto é preocupante quando temos um expoente inteiro.

Há 3 dias no concurso de programação da U.P. queria calcular os cubos de uns números e colocar num array. Em vez de fazer simplesmente num*num*num , decidi usar o pow(). Acontece que perdi imenso tempo no concurso porque o arredondamento do pow() em 27 numeros havia um que calculava mal... exemplo: 19^3 dar 6858 em vez de 6859.

De facto, se calculares simplesmente: pow(19,3) ele dá o número correcto, mas o arredondamento não funciona.. no ciclo a calcular os 27 primos falha sempre nesse:

for (i=0 ; i<=b ; i++) // b neste caso seria 27 e "v" um array de long's

v[++nv]= (long) pow(i,3);

Não sei porque é k arredonda mal apenas no 19 (destes 27), visto que a parte fraccionária é sempre 0.

cumprimentos

Estranho :eek:

Eu fui testar isso e não verifiquei qualquer erro :confused:

Deixo aqui o código que testei:

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

int power(int x, int y)
{
if (y>0)
	return power(x,--y)*x;
else
	return 1;
}


void main(int argc, char *argv[])
{
int i, a, b;
for(i=0;i<100;i++)
{
	a=power(i,3);
	b=(long)pow(i,3);
	printf("[%d] - %d - %d\n",i,a,b);
}

system("pause");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

brinkaero,

Quase de certeza que usas o visual studio da microsoft... o visual studio para além de omitir erros que cometemos e fazer includes de librarias que não incluimos, de facto dá bem. Mas caso compiles com o Dev-C++  ou directamente com o GCC (até é a mesma coisa pk o Dev usa o GCC) que é usado nos correctores automáticos dos concursos, vês que de facto para o 19 (pelo menos) dá mal:

precisao191ar.th.jpg

Isto n ficou lá mt bem  :-[  Clica na img pa ver :X  ....  Basta fazer as contas.. 19^3 é 6859 e não 6858.

O visual studio é fixe até... mas tem coisas menos interessantes como esta  :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o código

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

int main(int argc, char*argv[]) {
int i, b;
for (i=0; i<=100; ++i) {
	b=(int)pow((float)i, 3);
	printf("[%d] - %d\n", i, b);
}

return 0;
}

o VisualC++ dá de facto o resultado correcto. Mas o GCC do CygWin também deu correcto... : :)

Ou o DevC++ usa uma versão desactualizada do GCC, ou não sei...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm.. eu compilei com o GCC via  djgpp... e dá o mesmo resultado do Dev  :wallbash:

Ainda não experimentei em linux... de kk forma, era só pa alertar que "coisas" destas podem acontecer  :thumbdown:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

LappyG4:~ jmf$ vim power.c
LappyG4:~ jmf$ gcc -Wall power.c 
power.c:15: warning: return type of 'main' is not 'int'
LappyG4:~ jmf$ ./a.out 
[0] - 0 - 0
[1] - 1 - 1
[2] - 8 - 8
[3] - 27 - 27
[4] - 64 - 64
[5] - 125 - 125
[6] - 216 - 216
[7] - 343 - 343
[8] - 512 - 512
[9] - 729 - 729
[10] - 1000 - 1000
[11] - 1331 - 1331
[12] - 1728 - 1728
[13] - 2197 - 2197
[14] - 2744 - 2744
[15] - 3375 - 3375
[16] - 4096 - 4096
[17] - 4913 - 4913
[18] - 5832 - 5832
[19] - 6859 - 6859

aqui deu bem!! nao tenho nenhuma maquina windows para testar! por favor vejam isso! tou a achar piada ele dar 2 resultados!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora