Tämä on siis harjoitustehtävä koulusta: http://msdos464.no-ip.com/c.htm
Mielestäni speksit ovat aika suppeat ja hieman epäselvät...
lainaus:
You cannot use the C standard math library in this exercise (in particular, you cannot use the exp function).
Miten saisin siis tehtyä funktion power(double a, double b) joka palauttaisi arvon double a^b? Jos b olisi kokonaisluku, tässähän ei olisi mitään ongelmaa. Yritin wikipediasta ja muualta etsiä, että miten tuon saisi laskettua. Enhän minä osaa laskea paperilla edes 3.1 ^ 2.2, vaikka matikkaa on lukiossa tullut paljon luettua :D
Todennäköisesti jatkan tässä topicissa kyselyitä, tehtävien taso näyttää olevan aika vaativa heti alkuunsa (vaikka on C:n perusteet).
Kertomafunktion kirjoittamisessa ei ollut ongelmia.
Linkkasitko nyt varmasti oikean tehtävän? Tuolla sivulla pyydetään tekemään funktio, joka laskee e^x:n, ei a^b:tä.
Tehtävähän on koodaushaasteeltaan melko matala. Mihin homma kaatuu? Ymmärrätkö linkkaamallasi sivulla olevan kaavan?
Tuohan menee suoraan tuon annetun kaavan mukaan. Funktio on selvästi tällainen:
double expTaylor(double x, int n)
{
double arvo = 0;
int i;
// Summa lausekkeesta i:n arvoilla 0 - n
for (i = 0; i <= n; ++i) {
arvo += sigmalauseke(x, i);
}
}Sitten vain toteutat funtkioon double sigmalauseke(double x, int i) tuon sigmamerkin jälkeisen kaavan, eikös vain? Tietenkin sitten kirjoitat sen oikeasti tuohon funktion sisään ja lasket ne i:n kertomat valmiiksi ja optimoit x:n potenssiinkorotusta niin, että joka kerta vain kerrot muistissa olevan arvon x^(i-1) uudelleen x:llä, jotta saat arvon x^i.
Metabolix tuon vaiheen itsekkin osasin (java & php perus jutut hyvin hallussa).
Ah ainiin.. ei sen tarvitsekkaan laskea potenssia liukuluku ^ liukuluku, kun tuo i on aina kokonaisluku. No sehän helpottaa asiaa kummasti :D No tämä tehtävä onnistuu sitten näillä ohjeilla.
Jos tehtävä olisikin ollut tehdä funktio a^b:
Perus lukiomatikalla voidaan johtaa a^b = e^[b ln [a]],
jonka e- ja ln-funktiot voidaan laskea käyttämällä tunnettuja summalausekkeita.
Johto menee siis näin:
a^b = e^c || ln
b ln [a] = c, eli
a^b = e^c = e^[b ln [a]]
Joo tuon kekkasin tänään päivällä.. Menetelmä tosin olisi aika työläs käsin tehtäväksi ;)
msdos464 kirjoitti:
Enhän minä osaa laskea paperilla edes 3.1 ^ 2.2, vaikka matikkaa on lukiossa tullut paljon luettua :D
Nuo voidaan laskea vaikkapa Taylorin kaavalla. Tällöin virhetermiä on helppo arvioda. Myös Newtonin iteraatiolla likiarvon saa kätevästi.
Eikös potenssi täydy tehdä funktiolla pow() ?
Toki, mutta tässä olikin ideana tehdä oma potenssiinkorotusfunktio:
lainaus:
You cannot use the C standard math library in this exercise (in particular, you cannot use the exp function).
Aihe on jo aika vanha, joten et voi enää vastata siihen.