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

ordep

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

15 mensagens neste tópico

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???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sei por ond comexar tenho k fazer de novo sera k dava para continuar com a normal???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, o da math.h trabalha. O que eu escrevi, trabalha também?

penso que sim, por que haveria de não trabalhar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ordep... como disse o rui... qual é o problema?

A única coisa que tens que fazer é chamar funções.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que isto está na secção Pascal?

EDIT: estava... ;)

Erro meu corrigido...

Cumpr. bk@ero  :confused:

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