Page 1 of 1

kjapt C-spørsmål

Posted: 14/09-2009 00:36
by Justin Sane
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 :)

Posted: 14/09-2009 00:51
by espen180
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?

Posted: 14/09-2009 01:06
by FredrikM
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

Posted: 14/09-2009 01:37
by Justin Sane
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

Posted: 14/09-2009 07:22
by Gommle
Hvis du bruker C (gjelder ikke C++) må begge tallene være double i pow(a, b)

Posted: 14/09-2009 09:39
by drgz
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.

Posted: 14/09-2009 14:15
by Justin Sane
tusen takk :D

Posted: 14/09-2009 19:08
by Gommle

Posted: 15/09-2009 21:11
by edahl
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

Posted: 16/09-2009 08:20
by drgz
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.