Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Potenssifunktio C:llä

Sivun loppuun

msdos464 [17.07.2007 20:08:09]

#

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.

tkarkkainen [17.07.2007 20:23:36]

#

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?

Metabolix [17.07.2007 20:35:50]

#

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.

msdos464 [17.07.2007 20:58:24]

#

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.

Jtm [18.07.2007 19:06:31]

#

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

msdos464 [18.07.2007 19:27:41]

#

Joo tuon kekkasin tänään päivällä.. Menetelmä tosin olisi aika työläs käsin tehtäväksi ;)

Jaska [27.07.2007 16:46:19]

#

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.

tesmu [27.07.2007 19:50:39]

#

Eikös potenssi täydy tehdä funktiolla pow() ?

Heikki [27.07.2007 21:34:12]

#

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


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta