Staralem sie tylko wyjasnic ze problemy z zapisem okreslonych liczb bez uzycia ulamkow to problem w kazdym systemie liczbowym i w kazdym predzej czy pozniej trzeba zaokraglac
ty policzyles to ulamkami, gdybym kazal Ci zapisac wynik 1/3 jako liczba po przecinku to tez popelnisz blad bo nie wpiszesz nigdzie nieskonczenie wiele trójek po przecinku, ratuje Cie tylko wiedza o tym ktore miejsce po przecinku jest
Grubo. Ciekawe czy po wykryciu usterki wiedziano dokładnie jak czas działania systemu wpływał na niedokładność śledzenia rakiet? A jeżeli tak to czemu do czasu wydania i rozpropagowania łatki nie przesłano rozkazu natychmiastowego i częstszego restartu systemów by zachować względną zdolność baterii do obrony śledzonego obszaru?
@avoner: Nie no. Dwa tygodnie to i tak ekspres, ale do czasu jej dostarczenia (jeżeli mieli wiedzę o skutkach liczenia czasu) to powinni wydać rozkaz restartów ręcznych systemu co godzinę albo ciut rzadziej dla zachowania akceptowalnej celności.
@gugulec to nie jest tak, że CPU czegoś nie lubi. On tylko liczy to, co każe się mu policzyć i tu żadnych błędów nie popełnia. Jeśli programator nie jest świadom ograniczeń binarnej reprezentacji zastosowanego systemu liczbowego, to nie uniknie związanych z tym fuckupów.
Z liczbami ujemnymi jest trochę inaczej niż na filmie. Przedstawiona tam konwencja jest intuicyjna dla ludzi i jak ktoś chce, to może jej używać, ale jest niepraktyczna. W praktyce używa się tzw. kodu uzupełnień do dwóch. Tam też jedynka na skrajnej lewej pozycji (tzw. najstarszy bit) sygnalizuje liczbę ujemną, ale ogólna zasada jest inna. Otóż żeby zapisać wartość ujemną, zapisujemy taką wartość jaka brakuje do 2ⁿ, gdzie n to liczba bitów. Jeśli rozpatrujemy bajt, to liczbę ujemną skonstruujemy zapisując wynikowi odejmowania od 256. A więc np. liczba -1 będzie zapisana jako 255 (1111 1111) a -2 jako 254 (1111 1110).
Dlaczego tak dziwnie? Otóż dzięki temu nie trzeba tak naprawdę w procesorze wprowadzać liczb ujemnych. Może on pracować na danych tak samo, jakby to były liczby dodatnie. Rozważmy np. działanie -2 + 3. Procesor dostanie: 1111 1110 0000 0011 Wykona dodawanie, nastąpi przepełnienie i wyjdzie 0000 0001 czyli 1. Wszystko się zgadza.
błędy spowodowane niedokładnością liczb zmiennoprzecinkowych są dość częste w grach, ale zazwyczaj dotyczy to nie czasu, ale współrzędnych. Po oddaleniu się odpowiednio daleko od miejsca gdzie gracz powinien się znajdować fizyka gry zaczyna świrować. Jak znacie jakąś grę która pozwala wyjść za mapę i przemieszkać się bez ograniczeń w jednym kierunku, to warto spróbować, efekty bywają ciekawe.
Częste są też przepełnienia liczba całkowitych, gdzie odpowienio duża liczba może przekręcić się na dużą
@dodd: Gandhi w cywilizacji miał agresję ustawioną na 0. A po wynalezieniu demokracji agresja zmniejszała się, i cyk, przepełnienie bo zmienna była całkowita nieujemna i nagle Gandhi rzuca atomówkami na prawo i lewo.
@smith78: w Half-life 2 chodząc/strafe'ując do tyłu i ciagle skacząc, można osiągnąć niesamowite prędkości. Mądrzejsi odemnie ustalili, że polega to na zliczaniu przebytej odległości przez silnik gry w ciągu jednej sekundy (jednego fps).
Działa to na zasadzie zaokrąglenia otrzymanych wartości współżędnych przy zliczaniu tickrate'ów. Następnie silnik gry próbuje przewidzieć pozycję gracza, na podstawie otrzymanych wyników... a przynajmniej tak to zrozumiałem.
Błąd ten odkryto, bo twórcy nie myśleli, że ktoś faktycznie
Pracuje w systemach central telekomunikacyjnych i kiedyś znaleźliśmy na szczęście na czas podobny błąd w naszym oprogramowaniu.
Przyczyną był błąd który ktoś popełnił przy rzutowaniu zmiennej całkowitoliczbowej przez co rejestr się przekręcał i zegar zaczynał chodzić od zera. Nie był to byle jaki zegar tylko tzw. RFN (Reference Frame Number), czyli licznik centrali RNC który monotonicznie jest inkrementowany o 1 co 10ms. Wartość RFN jest porównywana przez centralę z podobnymi zegarem zwanym BFN (B-node Frame Number) istniejącym w każdym jednym nadajniku podłączonym do tego RNC. Pozwala to centrali wyliczyć dokładny moment kiedy każdy pakiet danych ma być wysłany do określonego nadajnika tak aby po przebyciu całej drogi przewodami/radiolinią był na miejscu na czas, tak aby nadajnik mógł go wysłać w odpowiednią szczelinę czasową na radiu.
Krótko mówiąc, popsucie się zegara RFN skutkowało tym, że wszystkie połączenia transmitowane przez centralę zrywały się i nie można było nawiązać nowych. Zwyczajnie cała centrala przestawała działać. Dla konkretnego operatora cały ruch w Polsce utrzymują jakieś 4 do 5 centrale RNC tak dla opisana skali zjawiska.
Ciekawostka: debile, którzy tworzyli system ticketowy redmine, wpadli na genialny pomysł liczenia czasu na floatach. W związku z tym, gdy wpiszę się za dużo krótkich odcinków czasu dla zadania, np. po 5 lub 10 minut, to łączny czas czasami nie zgadza się na plus lub minus kilka minut, przez co w robocie jak sprawdzam, czy wpisałem 8 godzin, to mam czasem 7:59, albo 8:02.
Komentarze (90)
najlepsze
źródło: comment_1671905030AYYVp5JMyEZ76BFD8uJKWy.jpg
PobierzStaralem sie tylko wyjasnic ze problemy z zapisem okreslonych liczb bez uzycia ulamkow to problem w kazdym systemie liczbowym i w kazdym predzej czy pozniej trzeba zaokraglac
ty policzyles to ulamkami, gdybym kazal Ci zapisac wynik 1/3 jako liczba po przecinku to tez popelnisz blad bo nie wpiszesz nigdzie nieskonczenie wiele trójek po przecinku, ratuje Cie tylko wiedza o tym ktore miejsce po przecinku jest
Temat walkowany wielokrotnie.
źródło: comment_1671919272FzypQLoSyYEop7Nb0GQExd.jpg
PobierzDlaczego tak dziwnie? Otóż dzięki temu nie trzeba tak naprawdę w procesorze wprowadzać liczb ujemnych. Może on pracować na danych tak samo, jakby to były liczby dodatnie. Rozważmy np. działanie -2 + 3. Procesor dostanie:
1111 1110
0000 0011
Wykona dodawanie, nastąpi przepełnienie i wyjdzie 0000 0001 czyli 1. Wszystko się zgadza.
Ja średnio raz na miesiąc rzygam bo globalna instytucja finansowa nie ogarnia stref czasowych ( ͡° ʖ̯ ͡°)
@pkusmierczyk: i dodaje ci coś do pożywienia?
Częste są też przepełnienia liczba całkowitych, gdzie odpowienio duża liczba może przekręcić się na dużą
A po wynalezieniu demokracji agresja zmniejszała się, i cyk, przepełnienie bo zmienna była całkowita nieujemna i nagle Gandhi rzuca atomówkami na prawo i lewo.
w Half-life 2 chodząc/strafe'ując do tyłu i ciagle skacząc, można osiągnąć niesamowite prędkości.
Mądrzejsi odemnie ustalili, że polega to na zliczaniu przebytej odległości przez silnik gry w ciągu jednej sekundy (jednego fps).
Działa to na zasadzie zaokrąglenia otrzymanych wartości współżędnych przy zliczaniu tickrate'ów. Następnie silnik gry próbuje przewidzieć pozycję gracza, na podstawie otrzymanych wyników... a przynajmniej tak to zrozumiałem.
Błąd ten odkryto, bo twórcy nie myśleli, że ktoś faktycznie
Przyczyną był błąd który ktoś popełnił przy rzutowaniu zmiennej całkowitoliczbowej przez co rejestr się przekręcał i zegar zaczynał chodzić od zera. Nie był to byle jaki zegar tylko tzw. RFN (Reference Frame Number), czyli licznik centrali RNC który monotonicznie jest inkrementowany o 1 co 10ms. Wartość RFN jest porównywana przez centralę z podobnymi zegarem zwanym BFN (B-node Frame Number) istniejącym w każdym jednym nadajniku podłączonym do tego RNC. Pozwala to centrali wyliczyć dokładny moment kiedy każdy pakiet danych ma być wysłany do określonego nadajnika tak aby po przebyciu całej drogi przewodami/radiolinią był na miejscu na czas, tak aby nadajnik mógł go wysłać w odpowiednią szczelinę czasową na radiu.
Krótko mówiąc, popsucie się zegara RFN skutkowało tym, że wszystkie połączenia transmitowane przez centralę zrywały się i nie można było nawiązać nowych. Zwyczajnie cała centrala przestawała działać. Dla konkretnego operatora cały ruch w Polsce utrzymują jakieś 4 do 5 centrale RNC tak dla opisana skali zjawiska.
Z