Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

[ROZWIĄZANE] Liczba całkowita na zmiennoprzecinkową


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


  • Zamknięty Temat jest zamknięty
12 odpowiedzi w tym temacie

#1 psilocybe

    Toasty!

  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 12.01.2015 22:10

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


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 12.01.2015 22:18

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

A co zwraca?
  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 psilocybe

    Toasty!

  • Autor tematu
  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 12.01.2015 22:32

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


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#4 wooDy.

    Pomocny

  • Użytkownik

Reputacja: 24
Życzliwy

  • Postów:71
  • Lokalizacja:Kraków
Offline

Napisano 12.01.2015 22:32

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

  • +
  • -
  • 1
b_350_20_00DF04_000000_FFFFFF_00DF04.png
b_350_20_00DF04_000000_FFFFFF_00DF04.png

#5 psilocybe

    Toasty!

  • Autor tematu
  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 12.01.2015 22:43

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.


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#6 wooDy.

    Pomocny

  • Użytkownik

Reputacja: 24
Życzliwy

  • Postów:71
  • Lokalizacja:Kraków
Offline

Napisano 12.01.2015 22:48

new Float:f_myGravitation = 1.0 - ( float(knife_skills[ id ]) / float(1000) )
?
  • +
  • -
  • 1
b_350_20_00DF04_000000_FFFFFF_00DF04.png
b_350_20_00DF04_000000_FFFFFF_00DF04.png

#7 psilocybe

    Toasty!

  • Autor tematu
  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 12.01.2015 23:03

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?


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#8 wooDy.

    Pomocny

  • Użytkownik

Reputacja: 24
Życzliwy

  • Postów:71
  • Lokalizacja:Kraków
Offline

Napisano 12.01.2015 23:25   Najlepsza odpowiedź

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

  • +
  • -
  • 1
b_350_20_00DF04_000000_FFFFFF_00DF04.png
b_350_20_00DF04_000000_FFFFFF_00DF04.png

#9 psilocybe

    Toasty!

  • Autor tematu
  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 13.01.2015 00:17

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


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#10 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 13.01.2015 03:26


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


  • +
  • -
  • 1

#11 psilocybe

    Toasty!

  • Autor tematu
  • Power User

Reputacja: 252
Wszechwidzący

  • Postów:524
  • Steam:steam
  • Imię:Filip
  • Lokalizacja:PL
Offline

Napisano 13.01.2015 06:21


ż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.


  • +
  • -
  • 0

Dołączona grafika

Dołączona grafika


#12 radim

    Godlike

  • Moderator

Reputacja: 939
Master

  • Postów:2 725
  • Steam:steam
  • Imię:Arkadiusz
  • Lokalizacja:Janów Lub.
Offline

Napisano 13.01.2015 06:37

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
  • +
  • -
  • 0

Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !


#13 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 13.01.2015 10:38

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 :)
  • +
  • -
  • 3

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych