Ir para o conteúdo
ordep

[C] Ajuda: Máquina de calcular cientifica em c

Mensagens Recomendadas

ordep    0
ordep

Alg aqui sabe como fazer uma maquina cientifica em c???eu ja fix uma normal mas nao tou a conseguir fazer a cientifica??alg sabe um link de um site???

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

não sei exactamente o que pretendes, mas acho que era só acrescentar funcionalidades à normal...

tenta ser mais explícito nas dúvidas que tens.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
ordep    0
ordep

tenho uma maquina normal ja feita em c!!! o prob gostava de fazer uma cientifica e nao sei como fazer...a minha maquina a unica coisa que faz é somar,dividir,multiplicar e subtrair...gostava que me  fizesse os expoentes,as raizes quadradas mas nao sei como...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

já existem funções em C para a raíz quadrada, seno, co-seno, etc.

para os expoentes, também não é difícil definir a função, basta fazer um ciclo (embora para que seja efiente já seja ligeiramente mais difícil).

vai colocando aqui o que já tens feito, que quando tiveres dúvidos o pessoal dá uma ajuda.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

uma forma +- eficiente de se fazer uma função exponencial em C. (log expoente)

int mypow(int a,int b) { /*a elevado a b*/
if (b==0) return 1;
return b%2==0?pow(a,b/2)*pow(a,b/2):pow(a,b/2)*pow(a,b/2)*a;
}

2^4 = 2^2*2^2

2^5 = 2^2*2^2*2

Para expoentes grandes:

2^100 = 2^50*2^50.

Conseguimos reduzir o expoente para metade em cada iteração.

Quando expoente = 100, fazemos 10 iterações ao contrário das 100 esperadas.

Se for = 10000, fazemos somente 100, etc.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

uma forma +- eficiente de se fazer uma função exponencial em C. (log expoente)

int mypow(int a,int b) { /*a elevado a b*/
if (b==0) return 1;
return b%2==0?pow(a,b/2)*pow(a,b/2):pow(a,b/2)*pow(a,b/2)*a;
}

2^4 = 2^2*2^2

2^5 = 2^2*2^2*2

Para expoentes grandes:

2^100 = 2^50*2^50.

Conseguimos reduzir o expoente para metade em cada iteração.

Quando expoente = 100, fazemos 10 iterações ao contrário das 100 esperadas.

Se for = 10000, fazemos somente 100, etc.

por acaso não sabia que já existia a função 'pow'...

já agora, não era melhor colocar o valor de 'pow(a,b/2)' numa variável em vez de o calcularmos duas vezes?

EDIT:

não seria melhor por a função a receber double's e esquecer a divisão inteira (visto que a função 'pow' trabalha com double's)?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Warrior    68
Warrior

Sim.

Há sempre formas de aperfeiçoar..

A técnica de guardar pow(a,b/2) chama-se memoization, gravar valores anteriores num vector para os irmos buscar. Muito frequente, por exemplo, no algoritmo recursivo da sequência de Fibonacci.

Neste problema em particular, nem é preciso vector auxiliar:

long long mypow(long long a,long long b) { /*a elevado a b*/
       long long c;
if (b==0) return 1;
       c=pow(a,b/2);
return b%2==0?c*c:c*c*a;
}

Edit: Não uso doubles porque não tenho a certeza que a função funcione com floats. Julgo que não. Por via das dúvidas deixo-a pelos inteiros (ainda que extra-large).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
Rui Carlos

Edit: Não uso doubles porque não tenho a certeza que a função funcione com floats. Julgo que não. Por via das dúvidas deixo-a pelos inteiros (ainda que extra-large).

a função trabalha com double's:

double pow(double x, double y);

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade