←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Liczba całkowita na zmiennopr...


Najlepsza odpowiedź wooDy. 12.01.2015 23:25

Zależy co chcesz osiągnąć. Jeśli parametrem funkcji, której chcesz użyć jest zmienna typu float, musisz dostarczyć dane w tej formie.
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
Przejdź do postu
Zablokowany

  • +
  • -
psilocybe - zdjęcie 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 :D

 

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

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 12.01.2015

ale mi nie zwraca dobrego wyniku powyższe działanie

A co zwraca?
Odpowiedz

  • +
  • -
psilocybe - zdjęcie psilocybe 12.01.2015

Coś dziwnego :D

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 :D

Odpowiedz

  • +
  • -
wooDy. - zdjęcie 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
Odpowiedz

  • +
  • -
psilocybe - zdjęcie 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.

Odpowiedz

  • +
  • -
wooDy. - zdjęcie wooDy. 12.01.2015

new Float:f_myGravitation = 1.0 - ( float(knife_skills[ id ]) / float(1000) )
?
Odpowiedz

  • +
  • -
psilocybe - zdjęcie 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?

Odpowiedz

  • +
  • -
Najlepsza odpowiedź wooDy. - zdjęcie wooDy. 12.01.2015

Zależy co chcesz osiągnąć. Jeśli parametrem funkcji, której chcesz użyć jest zmienna typu float, musisz dostarczyć dane w tej formie.
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
Odpowiedz

  • +
  • -
psilocybe - zdjęcie 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 :D

Odpowiedz

  • +
  • -
grankee - zdjęcie 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

Odpowiedz

  • +
  • -
psilocybe - zdjęcie 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ść :D

 

Dzięki.

Odpowiedz

  • +
  • -
radim - zdjęcie radim 13.01.2015

Wiadomość wygenerowana automatycznie


Ten temat został zamknięty przez moderatora.

Powód: Pomoc udzielona

Jeśli się z tym nie zgadzasz, report.png raportuj ten post, a moderator lub administrator rozpatrzy go ponownie.


Z pozdrowieniami,
Zespół AMXX.PL
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 13.01.2015

Jeśli nie chcesz mieć miliarda cyfr po przecinku to nie operuj na floatach.

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 :)
Odpowiedz
Zablokowany