ja się tylko dorzucę, że co do c++ zależy do od kompilatora, nie tłumacząc szerzej, czemu (*). bardziej uniewersalny kod będzie wyglądał tak:
int exp =(int)( (50*x*x*x)/3 - (100*x*x) + (850*x)/3 - 200);
gdzie x to level. Powinno pomóc niektórym.
* - może jednak tłumacząc? niektóre kompilatory "widząc" zapis 50/3, tworzą z tego zmienną typu int (np. bcb 6.0, DEV 4.9.9.2), co wpływa znacząco na obliczenia (zapewne wyszło 94 zamiast 100 na drugim lvl). Inna sprawa, pisząc "(float)50/(float)3", chociaż to trochę masło maślane, może wyjść albo 0 (przypadek DEVa), albo 16.6666660308838 (przypadek BCB). To szesnaście i coś tam nie daje także dobrych wyników, chyba od 7 lvl zaczyna wskakiwać 1 zamiast zero na końcu, i analogicznie cała tabela się odpowiednio burzy.
Dlaczego więc w taki dziwny sposób? Ponieważ tymczasowa wartość pozostaje intem do samego końca, a w momencie dzielenia (ostatnia operacja dla składnika - ułamek ciągle siedzi gdzieś w mnożeniu) końcówka jest ucinana (automatycznie rzutuje na int), co w efekcie daje... dobry wynik. Można się oczywiście bawić w nawiasy, ale wystarczy zapamiętać, że kompilator liczy zgodnie z kolejnością działań od lewej do prawej - i jak w pewnym momencie ułamek zostanie zrzucony do int, no to dupa. Tak jest niestety ze zmiennymi przecinkowymi, że wariują czasami.
|