←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

Niedokładność rzędu 0.1 lub 0.01 przy oper...


  • +
  • -
Rivit - zdjęcie Rivit 25.12.2014

Witam,

 

Mam taki problem, że jest niedokładność przy liczeniu na floatach.

SS'y w załączniku:

 

kod:

formatex(x, charsmax(x), "Wytrzymalosc \r(%i/%i) (+%i) \y(Zmniejsza obrazenia o \r%0.2f%%\y)", wytrzymalosc_gracza[id], limit, PobierzWytrzymalosc(id, 0, 1, 1), floatmul(float(PobierzWytrzymalosc(id, 1, 1, 1)), 0.26));
formatex(z, charsmax(z), "Kondycja \r(%i/%i) (+%i) \y(Zwieksza predkosc o \r%i\y)", kondycja_gracza[id], limit, PobierzKondycje(id, 0, 1, 1), PobierzKondycje(id, 1, 1, 1));
formatex(e,charsmax(e), "Obrazenia \r(%i/%i) (+%i) \y(Zwieksza obrazenia o \r%0.1f%%\y)", obrazenia_gracza[id], limit, PobierzObrazenia(id, 0, 1, 1), floatmul(float(PobierzObrazenia(id, 1, 1, 1)), 0.5));
formatex(a, charsmax(a), "Zrecznosc \r(%i/%i) (+%i) \y(Zwieksza szanse na unik o \r%0.2f%%\y)", zrecznosc[id], limit, PobierzZrecznosc(id, 0, 1, 1), float(PobierzZrecznosc(id, 1, 1, 1))*0.22)

Co może być przyczyną niedokładności?

Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 26.12.2014

W czym floatmul jest lepsza od 1.4*3.5, że zasłużyła sobie na wystąpienie?

 

Ja na przykład miałem problemy z floatpower, a okazało się, że przemnożenie przez siebie floata działa świetnie.

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 26.12.2014

Czy właśnie wymusiłem napisanie artykułu?

Czyli jeżeli dobrze rozumiem, to mam postąpić tak:
- mam do pomnożenia 500*0.11
- mnożę 500*11
- dzielę przez 100.0

to jedyny sposób?
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 26.12.2014

Napisałem post tutaj, ale wyszedł długi i dość treściwy to pomyślałem, że jeszcze troszkę uzupełnię i zrobię z niego artykuł :) Ale dlaczego minusujesz? :(

 

Wytrzymałość jak mniemam jest liczbą całkowitą? Jeśli całkowitą, to pomnóż PobierzWytrzymalosc razy 100, następnie razy 13 i podziel przez 50 (Twój magiczny mnożnik 0.26 tylko zamieniony na ułamek zwykły, aby unikać floatów) i tak otrzymaną liczbę zapisz w zmiennej, np wynik. Teraz:

formatex(x, charsmax(x), "Wytrzymalosc \r(%i/%i) (+%i) \y(Zmniejsza obrazenia o \r%d.%02d%%\y)", wytrzymalosc_gracza[id], limit, PobierzWytrzymalosc(id, 0, 1, 1), wynik/100, wynik % 100)

W ten sposób zawsze otrzymasz dokładny wynik.

 

%02d wyświetla liczbę na 2ch pozycjach (czyli 2 znaki, ni mniej ni więcej) i uzupełnia zerami, więc jeśli zapodasz 144 dostaniesz 44, jeśli zapodasz 12 dostaniesz 12, jeśli zapodasz 2, dostaniesz 02.

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 26.12.2014

Dzięki wielkie.

Dałem minusa? Sorki, a da sie cofnąć? Bo na wersji mobilnej te przyciski są blisko siebie a zamarznietymi palcami ciezko trafic.


A co z moim sposobem z dzieleniem na koncu przez 100.0? Co w nim nie tak?
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 26.12.2014

To, że dalej operujesz na floatach, ino trochę później :)

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 26.12.2014

A jak zrobić coś takiego Twoją metodą?

 

Mam state niewidzialnosc, chcę obliczyć w jakim procencie mnie teraz widać.

 

Jak uniknąć tu floatów?

 

(255-niewidka) : 255

 

Pogrubione zawsze będzie całkowite, ale wynik nie :/

 

Jak to zapisać w formacie:

%d.%02d
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 27.12.2014

Według mnie jak już używasz procentów to floatów użyj i później floatround

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 27.12.2014

Ale jak zrobić tym sposobem co Gwyn podał?

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 27.12.2014

 procenty = widocznosc*100/255
Gdzie widoczność to liczba całkowita z przedziału od 0 do 255. Otrzymasz liczbę całkowitą i mimo dzielenia, cały czas operujemy na liczbach całkowitych.
Odpowiedz