Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Omituinen lasku virhe

mika132 [09.05.2011 01:01:03]

#

Olen tässä jo pari päivää pyöritellyt kaavaa ja tulostellut sen arvoa. Vihdoin hoksasin missä vika piilee, mutta en ymmärrä mistä se voi johtua..

Eli autoa kiihdyttäessä lisätään joku esim (0.02 nopeus muuttujaan) nyt kehitin kaavan mikä laskee 0.9 vauhti lisäykseksi.

std::vector<Cars::OmatAutot>::iterator autoo = Autot.begin();
while(autoo != Game::Autot.end()){
    if (autoo->omistaja == 1) {
        kiihtyy = autoo->tehot / (EriAutot::toyota_corolla_ke_20_paino / 50);
        max_nopeus_oma = autoo->tehot / (EriAutot::toyota_corolla_ke_20_paino / 200);
    } else {

    }
    autoo++;
}

Kyseinen "kiihtyy" muuttuja tulostaa arvoksi 0.

JA:

kiihtyy muuttuja on määritelty floatiksi ja doubleakin olen koittanut. Mutta jos kirjoitan näin:

Olen tässä jo pari päivää pyöritellyt kaavaa ja tulostellut sen arvoa. Vihdoin hoksasin missä vika piilee, mutta en ymmärrä mistä se voi johtua..

Eli autoa kiihdyttäessä lisätään joku esim (0.02 nopeus muuttujaan) nyt kehitin kaavan mikä laskee 0.9 vauhti lisäykseksi.

std::vector<Cars::OmatAutot>::iterator autoo = Autot.begin();
while(autoo != Game::Autot.end()){
    if (autoo->omistaja == 1) {
        kiihtyy = autoo->tehot / (EriAutot::toyota_corolla_ke_20_paino / 50);
        max_nopeus_oma = autoo->tehot / (EriAutot::toyota_corolla_ke_20_paino / 200);
    } else {

    }
    autoo++;
}
kiihtyy=0.5;

Niin auto kiihtyy määrityksen mukaan vielä löytyy yksi MUTTA.. kaikki varmasti meinaavat että se ei suorita tuota minun autoo->omistaja kohtaa mutta VÄÄRIN.. jos muutan kaavaa niin, että tulokseksi tulee yli 1 auto lähtee viivalta liikkeelle.

Eli missä vika kun:
I. Muuttujan tyyppi on float

II. autoo->omistaja kohta suoritetaan kyllä.. Auto liikkuu jos kaavasta tulee yli 1 arvoksi

III. float arvo on kuitenkin oikea, koska jos asetan erikseen 0.5 arvon se menee läpi.. eli kaava jostain syystä pyöristää lukeman?

Grez [09.05.2011 01:24:55]

#

mika132 kirjoitti:

Eli missä vika kun:
I. Muuttujan tyyppi on float

Niin minkä noista kuudesta muuttujasta? Ilmeisesti ainakin "kiihtyy", koska sen sanoit jo aiemmin floatiksi.

Jos muuttujat "autoo->tehot" ja "EriAutot::toyota_corolla_ke_20_paino" on kokonaislukuja, niin silloin tuossa tehdään kokonaislukujakolasku, ja se tulos (kokonaisluku, esim. 0 tai 1) sitten muutetaan floatiksi ja sijoitetaan "kiihtyy" -muuttujaan. Eli tässä kohdassa ei tapahdu pyöristämistä, vaan desimaaliosan pois jääminen (joka käytännössä on sama kuin pyöristys alaspäin).

Oletuksilla, että nuo autoo->tehot ja EriAutot::toyota_corolla_ke_20_paino on kokonaislukuja, niin:

Arvaan että seuraavalla koodilla saisit paremmin haluamasi tuloksen:

kiihtyy = autoo->tehot / ((float)EriAutot::toyota_corolla_ke_20_paino / 50);

tai jos oikein laiskottaa niin

kiihtyy = autoo->tehot / (EriAutot::toyota_corolla_ke_20_paino / 50.0);

Syy, miksi esim. viimeinen toimii eri tavalla kuin alkuperäinen koodisi jätän "kotitehtäväksi".

Vastaus

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

Tietoa sivustosta