[ROZWIĄZANE] Liczba całkowita na zmiennopr...
Najlepsza odpowiedź wooDy. 12.01.2015 23:25
Nie jest to jakieś wielkie działanie, więc nie trzeba się przejmować, gdy używamy go np. przy spawnie. Liczby zmiennoprzecinkowe pokazywane za pomocą %f będą miały właśnie takie długie wyrażenie, jeśli chcesz pokazać to w formie np. 0.75, użyj %.2f(tu się mogę mylić - dawno nie używałem). Funkcja format jest używana do formatowania stringów(=ciągu znaków), więc rzadko używa się jej do operacji na liczbach. Floatround zwraca liczbę całkowitą(1,2..100,101) zaokrąglając float, który podajemy jako 1. parametr. Na przykład:
myInt = floatround(1.6) // myInt == 2Przejdź do postu
psilocybe
12.01.2015
Zacznę od tego że matematyka to czarna magia dla mnie
Więc tak, chcę ustawić grawitację graczowi w zależności od tego jaki ma level - problem jest taki że level rośnie a grawitacja ma spadać więc trzeba matematyki
No i mamy tak:
zmienna: knife_kills[] (posiadany level, liczba całkowita)
funkcja: set_user_gravity
Wymyśliłem coś takiego:
new Float:grawi = 1000.0 - knife_kills[id] * 0.001;
Załóżmy że knife_kills[id] to 250, więc 1000-250 * 0.001 powinno dać 0.75
Teraz wystarczy set_user_gravity(id, grawi) ale mi nie zwraca dobrego wyniku powyższe działanie.
Nie potrafię tego rozgryźć, chodzi o to że w fukcnji set_user_gravity nie mogę użyć liczb całkowitych typu 700, 500 tylko zmiennoprzecinkowej.
Więc pytanie brzmi jak to ogarnąć, by w zmiennej Float:grawi otrzymać liczbę x.xx czyli np. 0.75 w przypadku gdy knife_kills = 250
psilocybe
12.01.2015
Coś dziwnego
client_print(id, print_chat, "grawitacja wynosi: %d", grawi);
Pokazuje:
grawitacja wynosi: 1148841935
Akurat w tym momencie knife_kills[id] było większe niż 250, wyobraź sobie że zabiłem się spadając z krawężnika wysokości 16 jednostek gry
wooDy.
12.01.2015
new Float:f_myGravitation = 1.0 - ( knife_skills[ id ] / 1000 )
Float to nie liczba całkowita, użyj na przykład %f
Użytkownik wooDy. edytował ten post 12.01.2015 22:33
psilocybe
12.01.2015
Mój błąd z tym %d, kody wygląda aktualnie tak:
new Float:f_myGravitation = 1.0 - (knife_kills[id] / 1000) set_user_gravity(id, f_myGravitation) client_print(id, print_chat, "grawitacja wynosi: %f", f_myGravitation);
Nadal nie działa, pokazuje:
grawitacja wynosi: 1.000000 (w momencie gdy knife_kills było blisko 300), poza tym przydała by się liczba tylko z dwoma miejscami po przecinku (może lepiej 3?), nie zależy mi na aż tak dokładnej grawitacji.
wooDy.
12.01.2015
new Float:f_myGravitation = 1.0 - ( float(knife_skills[ id ]) / float(1000) )?
psilocybe
12.01.2015
Działa, tylko zbyt dużo miejsc po przecinku jak pisałem wyżej.
Czyli przy tego typu działaniach wskazywać wszędzie float? Czyli gdybym używał tej funkcji bardzo często to lepiej wykonać drugie działanie wcześniej i przekazać w zmiennej Float?
Proszę o wytłumaczenie tego jeżeli można, no i co z tymi miejscami po przecinku? format pomoże czy pomyłka? Jak to ugryźć?
No i gdy będę pokazywał graczowi jaką ma grawitację np. w hud, to powiedzmy że poza odwrotnym działaniem będę potrzebował funkcji floatround tak?
Najlepsza odpowiedź
wooDy.
12.01.2015
Nie jest to jakieś wielkie działanie, więc nie trzeba się przejmować, gdy używamy go np. przy spawnie. Liczby zmiennoprzecinkowe pokazywane za pomocą %f będą miały właśnie takie długie wyrażenie, jeśli chcesz pokazać to w formie np. 0.75, użyj %.2f(tu się mogę mylić - dawno nie używałem). Funkcja format jest używana do formatowania stringów(=ciągu znaków), więc rzadko używa się jej do operacji na liczbach. Floatround zwraca liczbę całkowitą(1,2..100,101) zaokrąglając float, który podajemy jako 1. parametr. Na przykład:
myInt = floatround(1.6) // myInt == 2
Użytkownik wooDy. edytował ten post 12.01.2015 23:33
psilocybe
13.01.2015
Miejsca po przecinku to %.2f i działa ale teraz mam kolejny problem.
Chcę pokazać graczowi jego prawdziwą grawitację, nie 0.75, nie -25% tylko np. 600 (przykład gdy level wynosi 250)
Więc najprościej chyba będzie pomnożyć początkową wartość 800 * f_myGravitation, tylko jak? Przerasta mnie to
grankee
13.01.2015
Załóżmy że knife_kills[id] to 250, więc 1000-250 * 0.001 powinno dać 0.75
mi wyszło 999,75
Więc najprościej chyba będzie pomnożyć początkową wartość 800 * f_myGravitation, tylko jak?
800 * f_myGravitation
Odpowiedź masz w pytaniu
psilocybe
13.01.2015
żmy że knife_kills[id] to 250, więc 1000-250 * 0.001 powinno dać 0.75
mi wyszło 999,75
Wiem, nawiasy trzeba by było dać
Odpowiedź w pytaniu to moja specjalność
Dzięki.
radim
13.01.2015
Ten temat został zamknięty przez moderatora.
Powód: Pomoc udzielona
Jeśli się z tym nie zgadzasz, raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.
Z pozdrowieniami,
Zespół AMXX.PL
GwynBleidD
13.01.2015
Przykład: jeśli Twoja funkcja na obliczanie grawitacji wygląda tak:
new Float:f_myGravitation = 1.0 - ( float(knife_skills[ id ]) / float(1000) )zmień ją na:
new myGravitation = 1000 - knife_skills[id]i grawitację ustawiaj w ten sposób:
set_user_gravity(id, float(myGravitation)/1000.0)a wyświetlaj:
client_print(id, print_chat, "grawitacja wynosi: %d", myGravitation*800/1000);nie dość, że kod jest optymalny, bo nie używamy wszędzie floatów, a tylko raz to jeszcze zyskujesz dokładną precyzję bez błędu.
Warto jeszcze wstawić zamiast 800 faktyczną globalną grawitację serwera (pobraną np z cvaru sv_gravity).
Więcej o floatach i dlaczego warto ich unikać gdzie się da: Floaty i ich wady
Oprócz tego warto pamiętać, że działania na floatach są dużo bardziej złożone obliczeniowo od działań na liczbach całkowitych. W starych komputerach do operacji na floatach służył osobny procesor