Jump to content

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


Recommended Posts

Posted

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

Posted

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

Posted

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.

Posted

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.

Posted

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

Posted

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

Posted

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

Posted

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

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

Posted

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

EDIT: estava... 😉

Erro meu corrigido...

Cumpr. bk@ero  😕

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.