kjapt C-spørsmål

Det er god trening å prate matematikk. Her er det fritt fram for alle. Obs: Ikke spør om hjelp til oppgaver i dette underforumet.

Moderators: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Post Reply
Justin Sane
Dirichlet
Dirichlet
Posts: 166
Joined: 19/11-2007 11:30
Location: Tønsberg

Sitter litt og programmerer litt i C og har støtt på en vegg: Hva er det man skal bruke for eksponenttegn? Jeg prøvde ^ uten hell..

veit det er matteforum :roll:
men tenker at det er nok av folk her som har peil :)
2. år Prod. ingeniør
espen180
Gauss
Gauss
Posts: 2578
Joined: 03/03-2008 15:07
Location: Trondheim

Har ingen C-erfaring, men prøver likevel.

For [tex]a^b[/tex] funker kanskje

Code: Select all

exp(b*log(a))
?

Kanskje verdt et forsøk?
FredrikM
Poincare
Poincare
Posts: 1367
Joined: 28/08-2007 20:39
Location: Oslo
Contact:

Et søk på Google (www.google.com) ga følgende resultat:
You can use pow()
pow(base, exponent)
http://www.velocityreviews.com/forums/t ... stion.html
Cube - mathematical prethoughts | @MatematikkFakta
Med forbehold om tullete feil. (både her og ellers)
Justin Sane
Dirichlet
Dirichlet
Posts: 166
Joined: 19/11-2007 11:30
Location: Tønsberg

hadde googla sjæl på forhånd, men den ga meg problemer når jeg brukte den i formler,

her i en renteformel: K*((1+(p/100))^n)

som da ble til K*(pow(1+(p/100)),n))

som ikke fungerte..

edit: Jeg trur sødern meg newton (edit: espen) sin fungerte :) takkar og bukkar
2. år Prod. ingeniør
Gommle
Grothendieck
Grothendieck
Posts: 857
Joined: 21/05-2007 20:05

Hvis du bruker C (gjelder ikke C++) må begge tallene være double i pow(a, b)
drgz
Fermat
Fermat
Posts: 757
Joined: 24/12-2008 23:22

Gommle wrote:Hvis du bruker C (gjelder ikke C++) må begge tallene være double i pow(a, b)
Ingen av tallene trenger å være double for å få ut riktig svar.

Code: Select all

int main(void)
{
	double a = 0.5, b = 16;
	float c = 0.5, d = 16;
	int q = 2, r = 4;
	
	printf("double: %f\n", pow(b, a));
	printf("float: %f\n", pow(d, c));
	printf("int: %f\n", pow(r, q));
}
gir ut

Code: Select all

double: 4.000000
float: 4.000000
int: 16.000000
som er riktig. Det en dog må passe på er at hvis en skal printe ut svaret uten å gå veien om andre variable må en benytte riktig operator i printf(). Ettersom pow() gir ut double, må en bruke %f for å få printet ut korrekt, med mindre en konverterer det til en int og trunkerer tall etter komma ved å bruke ((int)(pow(a,b)).

@ Justin Sane;

Hvis du lurer på funksjoner for C/C++, hva de gir ut osv anbefaler jeg;

http://www.cplusplus.com/reference/clibrary/
http://www.elook.org/programming/c/

Her står det aller meste du trenger om alle funksjonene som er innebygd i C (ansi) og C++.

Og et siste tips til slutt, hvis du kan unngå å benytte kode som (a / b), med mindre svaret blir et heltall, så burde du det. :)

Med følgende kodesnutt;

Code: Select all

int main(void)
{
	double k = 4;
	double p = 8;
	double t = 7;
	double q1 = 1 + 0.01 * 8;
	double q2 = 1 + (8 / 100);
	
	double s1 = k * pow(q1, t);
	double s2 = k * pow(q2, t);
	
	printf("s1: %f\n", s1);
	printf("s2: %f\n", s2);
}
blir resultatet

Code: Select all

s1: 6.855297 - riktig
s2: 4.000000 - galt
Her kan du se at kompilatoren anser 1 + (8 / 100) som 1 (selv om jeg bruker double og/eller float), mens hvis jeg skriver 1 + 0.01 * 8 får jeg riktig svar.
Justin Sane
Dirichlet
Dirichlet
Posts: 166
Joined: 19/11-2007 11:30
Location: Tønsberg

tusen takk :D
2. år Prod. ingeniør
edahl
Cantor
Cantor
Posts: 142
Joined: 23/12-2008 19:32

espen180 wrote:Har ingen C-erfaring, men prøver likevel.

For [tex]a^b[/tex] funker kanskje

Code: Select all

exp(b*log(a))
?

Kanskje verdt et forsøk?
Virker som en fin måte å få heavy med avrundingsfeil :-P
drgz
Fermat
Fermat
Posts: 757
Joined: 24/12-2008 23:22

Som du ser i eksempelet de bruker på siden trenger ikke argumentene til funksjonen å være av datatypen double, men det er jo ingenting i veien for at de er det dog. 8-)

Det viktigste er at en tar hensyn til hva funksjonen returnerer og bruker det deretter.
Post Reply