CNN podał, że z powodu błędu w oprogramowaniu pewien mieszkaniec USA został obciążony kwotą 23.148.855.308.184.500 USD.
Zdarza się 😉 Dla czytelników OSnews ciekawsze może być jednak to, że wkrótce potem pewien geek z krwi i kości rozgryzł na /. co mogło być przyczyną pomyłki. Założył, że kwota zapisywana jest jako liczba stałoprzecinkowa, a więc należy ją pomnożyć przez 100 i zapisać w ten sposób liczbę centów: 2314885530818450000. Następnie zauważył, że heksadecymalnie jest to 0x2020202020201250. Znak o kodzie 0x20 to… spacja. A więc prawdopodobnie 8-bajtowe pole, które miało zawierać wartość 0x1250 (46,88 USD) zostało dopełnione spacjami, zamiast zerami (w sensie 0x00).
Fajny przykład tego, jak na podstawie skromnej notki prasowej można wydedukować co nieco o szczegółach implementacji systemu.


W tym wytłumaczeniu nie pasuje mi jedynie to, że po konwersji tego jakby trochę przypadkowego ciągu bitów na system dziesiętny wyszła sumka zakończona 4 zerami (jakby zaokrąglona do 100 USD). Szanse na to są jak 1:10000. Screenshot na CNN.com pokazuje, że naprawdę suma miała na końcu 4 zera, to nie dziennikarze zaokrąglili. Więc może jest jakieś lepsze wytłumaczenie?
Aha, no i podobno kupował tylko papierosy. Camele chyba nie kosztują 46,88 USD 😉 Może kupił 10 paczek? Albo ściemnia? Inny koleś kupował papierosy za 3,29 USD i również zobaczył obciążenie na dokładnie tę samą kwotę.
To ma jakis zwiazek z prowizja.
Spacje to zgoda, ale końcówka to nie cena, jaką zaplacił.
A co to za nowy portal Dotslash?
O tym samym pomyślałem. 🙂
To pewnie to przyzwyczajenie do uruchamiania programów z konsoli… 😉
oj zamiast sie dopytywac mogles poprawic literowke 😉
A ukośnikkropka?
to jest przykład na to że palenie szkodzi 😀
Czy mi się zdaje czy gdyby dalej coś kupował to w końcu doszedłby do końca i liczba zamieniłaby się na dodatnią 🙂
Czy ja to dobrze myśle, bo jeśli int nie jest unsigned (czyli ma po równo liczb ujemnych jak i dodatnich licząc od zera to idąc w dół w końcu doszedłby do momentu zmiany na dodatnią:) ?
Chyba nikt nie przyjmie zamówienia na 92233720368547758,09 dolarów, a to najmniejsza dla ludzi cena, przy której wyjdzie ujemny koszt.
Nie rozumiem. Po co w ogóle uzupełniać tę liczbę czymkolwiek? No chyba że trzymają wszystko jako tablice charów i "zerują" wszystkie pola ręcznie. Hm, zaczynam się ich bać. 😀
Operacje bankowe, itp. mają ściśle określony sposób zapisu i zaokrąglania liczb. Z tego co słyszałem(historia z początku lat 90) jedna polska firma miała spore problemy to tym jak wymyślili że będą trzymać wszystko na doublach, bo przecież będzie bardzo dokładnie. Było aż do momentu instytucja zorientowała się że z systemu znikają jakieś miliony.
doublach ?
gratuluje systemu finansowego 🙂
Przeca wiekszości wartosci ułamkowych nie da się w systemie dwójkowym przedstawić dokładnie. Przykład 0.1+0.1+0.1-0.3. Mały hint do obliczeń finsnsowych trzeba decimali używać.
Po co jakieś double? Przecież można korzystać z liczb całkowitych, zwyczajnie. Mało co się nie zmieści w zwykłym incie, nie mówiąc już o long longach itd…
Inty są bardzo fajne, ale jest spory problem z ułamkami groszy, które często występują w różnych kursach, akcjach, giełdach itp. Rozwiązaniem jest trzymanie kwot w liczbach wymiernych.
"będą trzymać wszystko na doublach, bo przecież będzie bardzo dokładnie. Było aż do momentu instytucja zorientowała się że z systemu znikają jakieś miliony"
To chyba w Ghost in the Shell jeden terrorysta ocykał bank w ten sposób i kupił sobie za to bombę atomową :).
A gadanie, że problem. Nie słyszeli o typie Currency? Zapisuje się wartość na int do czwartego miejsca po przecinku (czyli zgodnie z metodologią obliczeń na giełdach i w bankach). Implementacja takiego typu jest banalnie prosta nawet w językach, które go nie mają.
Liczby stałoprzecinkowe nie rozwiązują problemu. Powiedzmy, że dolar staniał do funta o 0,0001 funta a funt do euro o 0,0001 euro. O ile staniał dolar do euro?
A jeżeli banki rzeczywiście gubią czwarte miejsce po przecinku, to da się to wykorzystać, np. kradnąc miliardy małych kwot po 0,0000001 centa :).
Kiedyś była dosyć słynna sprawa informatyka jednego z zachodnich banków… jak wiadomo banki obcinają te małe końcówki, gość ustawił system tak, że trafiały one na jego konto. Sprawa by się nie wydała, gdyby nie to że zachorował i bank zatrudnił jakiegoś zastępce na ten czas 😀
PS: Gdyby ktoś znalazł źródło tej "plotki" bo niestety mi zginęło 🙁
currency? int? to dla mienczaków. pisze sie <code>mov eax,[dword ptr</code> i tyle 😉
Może to ich sposób na walkę z kryzysem. 😛
błędy sie zdarzają 🙂
jak np ten http://lwn.net/Articles/341773/
aż dziw, że nie ma jeszcze newsa … trasz,ljz nie spać! 🙂
swoją drogą błąd jest bardzo ciekawy:)
Ja tam widzę 23 tryliony dolarów.
Zle widzisz. Jest to jeden z pierwszych newsow na osnews, w ktorych nie popelniono bledow w zapisie liczby oraz jej nazwie. 🙂
Jeszcze jedna uwaga: Zamiast kropek powinny być przecinki – jeśli już zachowywać notację oryginalną. Lub powinny być spacje, jeśli przyjąć notację polską.
Polska notacja ma kropki. Niestety 😉 Juz wole spacje. Tzn. jeszcze bardziej wolalbym przecinki, ale w polsce uzywa sie ich do czego innego.