Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Desimaaliluvut

Azure [22.04.2007 00:49:02]

#

Miten pysty laskemaan keskiarvon kolmella luvulla niin, että tulokseksi saataisiin desimaaliluku?

int mean_value(int t, int e, int w)
{
float l;
l = (t+e+w)/3;
cout << l   << endl << endl;
}

Jotain tollasta viritin laskin ohjelmaani funktioksi. Eli ohjelmassani siirretään tämän funktio parametreihin arvot toisessa funktiossa ja sitten lasketaan tässä funktiossa luvut t,e ja w yhteen ja jaetaan ne kolmella. Mutta desimaalilukuja en saa ohjelmaa näyttämään.

Esim:
Lukujen 5,8 ja 9 keskiarvo on 7,33333...
Ohjelma tulostaa vain 7

Antti Laaksonen [22.04.2007 00:54:58]

#

Kun muuttujat t, e ja w ovat kokonaislukuja, C-kääntäjä kuvittelee, että koko lasku (t+e+w)/3 lasketaan kokonaisluvuilla ja vasta sitten tehdään muunnos liukuluvuksi. Ratkaisu ongelmaan on kirjoittaa lasku muodossa (float)(t+e+w)/3, jolloin lukujen summa muutetaan ensin liukuluvuksi ja vasta sitten jaetaan kolmella. Toinen tapa on muuttaa funktion parametrit kokonaisluvuista (int) liukuluvuiksi (float), jolloin laskukaava kelpaa sellaisenaan.

Azure [22.04.2007 01:32:23]

#

Eli C++ kielessä ei voi laskea kokonaisluvuilla ja antaa vastaukseksi jokin liukuluku(desimaaliluku) vaan on muuttettava kokonaisluvut liukuluvuiksi jo alussa ennen niiden laskemista jos halutaan saadan vastaukseksi liukuluku?

Grez [22.04.2007 02:04:22]

#

Kielestä riippumatta ne on pakko muuttaa liukuluvuiksi ennen laskemista. Useimmiten prosessorit eivät osaa jakaa kokonaislukua kokonaisluvulla ja antaa tulokseksi liukulukua.

Joissakin kielissä se, että halutaan tehdä liukulukujako-operaatio kerrotaan suoraan operaattorilla (esim. Visual Basicissa / on liukulukujako ja \ on kokonaislukujako). C:ssä se kerrotaan antamalla joko jaettava tai jakaja tai molemmat liukulukuina.

Eli voisi sanoa, että C on niin nerokas, että sillä on mahdollista tehdä kokonaislukujako ja sijoittaa tulos liukulukumuuttujaan. Alustasta riippuen tuolla muunnoksella ja kokonaisluku- vs. liukulukuoperaatiolla voi olla hyvinkin suuri merkitys esim. nopeuden kannalta.

TsaTsaTsaa [22.04.2007 15:02:23]

#

Helpolla pääsee jos kirjoittaa näin:

l = (t+e+w)/3.0;

Eli koska jakaja on liukuluku, tulos on myös.

Vastaus

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

Tietoa sivustosta