Dlaczego liczby zmiennoprzecinkowe są często używane w nauce / inżynierii?


33

Podczas badania dokładności liczb zmiennoprzecinkowych widziałem w kilku miejscach zdanie podobne do

„liczba zmiennoprzecinkowa i liczba podwójna są ( zaprojektowane / wykorzystywane często ) w obliczeniach inżynierskich i naukowych

Z mojego zrozumienia wynika, że ​​siła liczb zmiennoprzecinkowych i podwójnych to ilość pamięci, jakiej używają ze względu na (dobrą, ale nie idealną) precyzję.

Wydaje mi się, że prawie rozumiem tę odpowiedź

„liczby zmiennoprzecinkowe pozwalają modelować wielkości ciągłe”

Nadal nie jestem przekonany, że rozumiem. Zarówno inżynieria, jak i nauka brzmią jak pola, w których chciałbyś uzyskać dokładne wyniki swoich obliczeń, których, moim zdaniem , zmiennoprzecinkowe nie dają. Nie jestem również pewien, czy dokładnie rozumiem, czym jest „ciągła ilość”.

Czy ktoś może rozwinąć to wyjaśnienie i być może podać przykład?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.Zarówno w nauce, jak i inżynierii zależy Ci na precyzji tylko do pewnego momentu. Stosowanie nieskończonej precyzji do każdego obliczenia jest często niepotrzebnie kosztowne. To, co odróżnia zmiennoprzecinkowy od stałego punktu, to to, że nie musisz zatwierdzać do określonej liczby miejsc po przecinku - możesz mieć naprawdę małe ilości z dużą liczbą miejsc po przecinku lub naprawdę duże ilości z ograniczoną precyzją.
Doval

24
Aby dodać do powyższych punktów, nie tylko nie zależy ci na precyzji wykraczającej poza pewien punkt, ale nie możesz uzyskać arbitralnie dokładnych wyników, ponieważ wiele z twoich danych wejściowych to mierzone wielkości, które zawierają pewne nieodłączne błędy.

2
Gniewem jest również wskazanie, że nie jest pewne, że błędy zaokrąglania będą się nadal kumulować. To zależy od tego, co robisz i jak to robisz; poświęcono temu całe pole .
Doval

10
Zmienny punkt nie jest „losową precyzją”, błędy dla różnych operacji są przewidywalne i dobrze znane, a błędy dla algorytmu można opracować. Jeśli są wystarczająco niskie (w szczególności jeśli błędy wstecz są mniejsze niż niepewności zmiennych wejściowych), możesz być pewien, że wyniki są dobre (lub przynajmniej, że jakiekolwiek problemy z nimi nie są spowodowane przez zmiennoprzecinkowe- błąd punktowy).
hobbs

Odpowiedzi:


77

Obliczenia w nauce i inżynierii wymagają kompromisów w zakresie precyzji, zasięgu i prędkości. Arytmetyka punktów stałych zapewnia precyzję i przyzwoitą prędkość, ale zmniejsza zasięg. BigNum, biblioteki o dowolnej precyzji, wygrywają w zakresie zasięgu i precyzji, ale tracą szybkość.

Sedno sprawy polega na tym, że większość obliczeń naukowych i inżynieryjnych wymaga dużej prędkości i dużego zasięgu, ale ma stosunkowo niewielkie potrzeby precyzji. Najbardziej dobrze określona stała fizyczna znana jest tylko z około 13 cyfr, a wiele wartości jest znanych z dużo mniejszą pewnością. Posiadanie więcej niż 13 cyfr precyzji na komputerze nie pomoże. Mucha w maści polega na tym, że sekwencje operacji zmiennoprzecinkowych mogą stopniowo tracić precyzję. Chleb i masło analizy numerycznej ustalają, które problemy są na to szczególnie podatne, i wymyślają sprytne sposoby zmiany kolejności operacji w celu ograniczenia problemu.

Wyjątkiem jest teoria liczb w matematyce, która musi wykonywać operacje arytmetyczne na liczbach z milionami cyfr, ale z absolutną precyzją. Teoretycy liczb często używają bibliotek BigNum, a ich obliczenia zajmują dużo czasu.


2
Dobra odpowiedź. Podczas gdy podstawowe funkcje mogą być idealnie ciągłe, co wymagałoby doskonałej precyzji do dokładnego modelowania, w rzeczywistości wszystko w nauce i inżynierii jest przybliżeniem. Wolelibyśmy raczej przyzwoite, użyteczne przybliżenia i osiągnąć coś niż nieskończoną precyzję, na którą czekalibyśmy wiecznie na zakończenie wielu operacji.
Jonathan Eunice

4
@JonathanEunice Nie można dokładnie modelować rzeczywistości. Dane wejściowe do modelu pochodzą z pomiarów i prawdopodobnie nigdy nie będziesz w stanie mierzyć rzeczy tak dokładnie, że natywna liczba rzeczywista we współczesnym komputerze / oprogramowaniu (w tym czasie) ograniczyłaby ją. Innymi słowy, możesz mieć idealny model, oprogramowanie lub matematykę, to nie ma znaczenia. Np. Oblicz objętość pudełka. a*b*cłatwe rzeczy, jednak musisz zmierzyć wymiary, których nie możesz zrobić z absolutną pewnością, dlatego tak naprawdę nie potrzebujesz nieskończonej precyzji obliczeń, wystarczy, aby zostać związanym błędem pomiaru.
luk32

2
@ luk32 Gwałtownie zgadzamy się co do większości tych punktów. Można dokładnie modelować coś (np. Objętość kuli), ale nigdy nie można dokładnie zmierzyć. A rzeczywistość nigdy nie pasuje idealnie do idealnego modelu. Lepiej uzyskać nieco nieprecyzyjne, użyteczne wartości / modele niż czekać na doskonałe pomiary lub obliczenia - coś, co zawsze będzie o krok.
Jonathan Eunice

2
„Sedno sprawy polega na tym, że większość obliczeń naukowych i inżynieryjnych wymaga dużej prędkości i dużego zasięgu”. Jeśli dam ci dużo czasu, nadal nie możesz obliczyć dokładnie, ponieważ algorytmy obliczające dokładnie nie są powszechnie znane. Po pierwsze, nie możemy nawet dokładnie przedstawić liczb. To tylko problem, którego nie umiemy rozwiązać, ani szybko, ani powoli.
Michael Le Barbier Grünewald

@ MichaelGrünewald, nie możemy dokładnie przedstawić liczb rzeczywistych, ale jesteśmy w stanie rozwiązać problemy z dokładnym przybliżeniem, abyśmy mogli budować struktury o wysokości kilku tysięcy stóp, identyfikować geny w DNA i spotkać satelitę z kometą po dwóch latach w kosmosie. Parafrazując Randy'ego Newmana, może to nie być dokładne, ale jest w porządku. W rzeczywistości możemy reprezentować racjonalne wartości dokładnie przy użyciu dowolnych bibliotek precyzji (z zastrzeżeniem ograniczeń pamięci).
Charles E. Grant

30

Jaką alternatywę proponujesz?

Ilości ciągłe są reprezentowane za pomocą liczb rzeczywistych w matematyce. Nie ma żadnego typu danych, który mógłby zakodować każdą możliwą liczbę rzeczywistą (ponieważ liczby rzeczywiste są niepoliczalne), więc oznacza to, że możemy wybrać tylko podzbiór liczb rzeczywistych, którymi jesteśmy najbardziej zainteresowani.

  • Możesz wybrać wszystkie obliczalne liczby rzeczywiste, co jest podobne do działania systemów algebry komputerowej (CAS). Problem polega na tym, że staje się on szybko niewykonalny, gdy drzewo ekspresji rośnie i rośnie. Jest również bardzo powolny: spróbuj rozwiązać symbolicznie ogromny układ równań różniczkowych w Mathematica i porównaj z innymi implementacjami opartymi na zmiennoprzecinkowych, a zobaczysz dramatyczną różnicę prędkości. Ponadto, jak zauważyli Jörg W Mittag i kasperd: nawet nie masz decydujących operacji równości / porównań.

  • Możesz użyć dokładnych liczb wymiernych, ale tak naprawdę nie działa to w wielu aplikacjach, ponieważ musisz obliczyć pierwiastki kwadratowe, cosinus lub logarytmy itp. Ponadto istnieje również tendencja do zwiększania złożoności wymiernych, a zatem wymaga więcej miejsca do przechowywania i czas na przetwarzanie, gdy wykonujesz na nich coraz więcej obliczeń.

  • Możesz także użyć liczb dziesiętnych o dowolnej precyzji, ale nawet coś tak prostego jak podział nie zadziała, ponieważ otrzymujesz nieskończenie powtarzające się cyfry. Możesz również natknąć się na problem rosnącej złożoności, ponieważ wykonujesz bardziej podobne do liczb wymiernych, choć w mniejszym stopniu.

W pewnym momencie będziesz zmuszony użyć aproksymacji, w którym to przypadku najlepiej sprawdzają się liczby zmiennoprzecinkowe. Liczby zmiennoprzecinkowe mają również stałą szerokość (w przeciwieństwie do wszystkich pozostałych 3 typów danych wspomnianych wcześniej), co zapobiega wzrostowi złożoności, gdy wykonujesz na nich coraz więcej obliczeń.


1
Jedna z najlepszych odpowiedzi, przeoczyłem ją przed napisaniem mojej.
Michael Le Barbier Grünewald

8
Ponadto istnieje nieco niewygodny fakt, że nie można nawet stwierdzić, czy dwie obliczalne liczby rzeczywiste są równe.
Jörg W Mittag

1
Czy przy użyciu wszystkich obliczalnych liczb rzeczywistych nie pojawiłby się problem z porównaniami? Jestem prawie pewien, że nie można porównywać dowolnych rzeczywistych obliczeń bez rozwiązania problemu zatrzymania.
kasperd

@kasperd: Myślę, że w pewnym stopniu zależałoby to od tego, jakie operacje można było zastosować w obliczeniach, chociaż nie jestem pewien, jak bogaty zestaw typów obliczeń można mieć i nadal gwarantuje, że dowolne dwa dowolne wyniki, które mogą być wyprodukowane w skończonej liczbie operacji można porównać w ograniczonym czasie. Typy algebraiczne prawie na pewno spełniłyby to kryterium, ale nie wiem, czy funkcje ln (x) i exp (x) mogłyby zostać dodane i nadal je spełniają.
supercat

Możesz obsługiwać arytmetykę dowolnej precyzji (dodawanie, mnożenie, odejmowanie, dzielenie), irracjonalne (jak √2), dobrze znane transcendentale (takie jak Pi i e), funkcje trigg itp., Używając ciągłych ułamków. Zobacz algorytm Gospera w HAKMEM. Po zakończeniu możesz wykonać leniwą ocenę, aby uzyskać przybliżenie zmiennoprzecinkowe do żądanej precyzji.
Paul Chernoch

14

Twoje twierdzenie o nauce jest błędne, inżynieria i nauka inne niż matematyka nie działają z dokładnymi dokładnymi wynikami. Działają one ze współczynnikiem precyzji wbudowanym w liczbę wyświetlanych cyfr.

Kluczowym terminem, który musisz tu zrozumieć jest: znaczące liczby . Znaczącymi liczbami liczby są te cyfry, które niosą znaczenie przyczyniające się do jej precyzji.

Co w gruncie rzeczy oznacza, że ​​jeśli stwierdzę, że coś ma długość 12 centymetrów, może faktycznie mieć długość między 11,5 a 12,5 centymetra. Jeśli jednak stwierdzę, że coś ma długość 12,00 centymetrów, może to być gdzieś pomiędzy 11995 a 12,005 centymetrów.

Jako przykład, jeśli weźmiesz taśmę pomiarową i zmierzysz swój salon. Chociaż może się okazać, że ma 6 metrów szerokości 25 centymetrów, wiesz, że twój pomiar taśmy nie był wystarczająco dokładny, aby powiedzieć cokolwiek o dokładności milimetrowej lub nanometrowej.


@leftaroundabout co to znaczy matematyka (jak w matematyce) nie jest nauką? Tak jest w mojej książce.
Pieter B

2
@PieterB: Matematyka nie jest nauką. To jest filozofia. Nauka to czynność kształtowania zrozumienia naszego świata fizycznego. Filozofia polega na zrozumieniu, w jaki sposób idee działają w idealnym świecie.
slebetman

Myślę, że nauka zwykle woli pracować z wyraźnymi przedziałami ufności niż znaczącymi liczbami.
Taemyr

@slebetman Poza tym, że nie ma to nic wspólnego z moim punktem w moim poście, jeśli matematyka jest nauką, czy nie, nie mogę powstrzymać się od cytowania: Natura jest z natury matematyczna i mówi do nas w matematyce. Musimy tylko słuchać. Ponieważ natura jest matematyczna, każda nauka, która zamierza opisać naturę, jest całkowicie zależna od matematyki. Nie można przecenić tej kwestii i dlatego Carl Friedrich Gauss nazwał matematykę „królową nauk”.
Pieter B

Ten cytat pochodzi stąd . Dobra lektura i dużo do omówienia, ale nie tutaj, ponieważ w rzeczywistości nie ma to nic wspólnego z twoim postem ani tym pytaniem.
leftaroundabout

7

Zauważ, że liczby zmiennoprzecinkowe są w zasadzie takie same jak notacja naukowa i inżynierska , czyli standardowy sposób pisania liczb w matematyce i nauce. Na tych polach nie ma wielkiej potrzeby ekstremalnej precyzji, ale często istnieje ogromny zasięg.

Aby wybrać przypadkowy przykład z mojej pracy domowej z fizyki, niedawno musiałem pracować z masą elektronu, która wynosi około 9,11 * 10 ^ -31 kg. Nie dbam o precyzję; dla mnie to wszystko może z łatwością wynosić 9,12. Ale zależy mi na wykładniku i nie chcę zapisywać 0,0000 ... 911 kg, więc używam notacji naukowej.

Podobne rozumowanie stosuje się w obliczeniach naukowych i inżynieryjnych: istnieje szeroki zakres, ale nie chcemy przechowywać i pracować z bardzo dużymi liczbami, więc przechowujemy znormalizowaną wartość i wykładnik, który jest mniejszy i szybszy w pracy.


6

Liczby zmiennoprzecinkowe mają również kilka właściwości, które dobrze nadają się do obliczania niektórych rodzajów wyników naukowych. Przede wszystkim precyzja jest odwrotnie proporcjonalna do wielkości, tak jak w notacji naukowej, dzięki czemu można przedstawić zarówno małe różnice zbliżone do zera, jak i większe znacznie dalej.

Artykuł Goldberga jest prawdopodobnie najbardziej znaną analizą właściwości liczb zmiennoprzecinkowych (i należy go czytać, jeśli zależy ci na tego rodzaju rzeczach), ale myślę, że prace Kahana lepiej tłumaczą uzasadnienie wielu subtelnych problemy projektowe.

W szczególności diatryba Kahana na temat implementacji zmiennoprzecinkowej w Javie , choć dość zapalna, czyni kilka dobrych argumentów na temat tego, dlaczego semantyka IEEE-754 jest przydatna, a bit wiele hałasu o znakach nic nie bada uzasadnienia znacznej liczby zerowej.


Nie przeczytałem jeszcze całego artykułu Kahana, ale wydaje się bardziej uprzejmy niż byłbym. Java mogłaby mieć wartości liczbowe, które byłyby bardziej użyteczne i działałyby szybciej niż to, co faktycznie ma, gdyby dodał realtyp, który przechowywałby trzy wpisy stosu do przechowywania i reprezentowałby naturalną precyzję obliczeniową maszyny; wartość może być przechowywana jako 80-bitowa zmiennoprzecinkowa + 16-bitowa zmiennoprzecinkowa 64-bitowa zmiennoprzecinkowa + 32-bitowa zmiennoprzecinkowa lub 64-bitowa mantysa, 16-bitowy wykładnik potęgi i 16 bitów dla znaku i flag [dla implementacji innych niż FPU].
supercat

Podaj, że floati doublesą formatami pamięci, i realjest formatem obliczeniowym. W wielu systemach bez FPU praca z mantysą, wykładnikiem i flagami na granicy słów i pół słów byłaby szybsza niż konieczność rozpakowywania i przepakowywania kopii podwójnych przy każdej operacji.
supercat

2

TL; DR Nie wiemy jak obliczyć większość funkcji z idealną precyzją, dlatego nie ma sensu przedstawiać liczb z idealną precyzją.

Wszystkie dotychczasowe odpowiedzi pomijają najważniejszy punkt: nie możemy obliczyć dokładnych wartości większości liczb. Jako ważny szczególny przypadek nie możemy obliczyć dokładnych wartości funkcji wykładniczej - przytaczając tylko najważniejszą funkcję nieracjonalną.

Naiwna odpowiedź na naiwne pytanie

Wygląda na to, że twoje pytanie brzmi „istnieją dokładne biblioteki arytmetyczne, dlaczego nie używamy ich zamiast arytmetyki zmiennoprzecinkowej?” Odpowiedź brzmi: dokładna arytmetyka działa na liczbach wymiernych i że:

  • Liczba Archimede'a - pedantyczna nazwa π - nie jest racjonalna.
  • Wiele innych ważnych stałych nie jest racjonalnych.
  • Wiele innych ważnych stałych nie jest nawet znanych jako racjonalnych lub nie.
  • Dla dowolnej niezerowej liczby wymiernej x liczba exp (x) jest nieracjonalna.
  • Podobne stwierdzenia dotyczą rodników, logarytmów i wielu funkcji ważnych dla naukowców (rozkład Gaussa, jego CDF, funkcje Bessela, funkcje Eulera,…).

Racjonalna liczba to szczęśliwy wypadek. Większość liczb nie jest racjonalna (patrz twierdzenie Baire'a), więc obliczanie liczb zawsze wyprowadzi nas z racjonalnego świata.

Co to jest obliczanie i reprezentowanie liczby?

Możemy zareagować mówiąc: „OK, problem polega na tym, że liczby wymierne nie były tak doskonałym wyborem do przedstawiania liczb rzeczywistych.” Następnie rozwijamy nasz widelec do debugowania i opracowujemy nowy system reprezentacji liczb rzeczywistych.

Jeśli chcemy obliczyć liczby, musimy wybrać system reprezentacji liczb rzeczywistych i opisać ważne operacje na nich - tj. Zdefiniować, co oznacza obliczanie . Ponieważ interesujemy się obliczeniami naukowymi, chcemy dokładnie przedstawić wszystkie liczby dziesiętne (nasze miary), ich iloraz (liczby wymierne), wartości funkcji wykładniczych i niektóre śmieszne stałe, takie jak liczba Archimede'a.

Problem polega na tym, że jedynym sposobem idealnego przedstawienia liczb w takim systemie jest użycie formy symbolicznej, to znaczy, aby w ogóle nic nie obliczać i pracować z wyrażeniami algebraicznymi. To raczej kaleka reprezentacja liczb rzeczywistych, ponieważ nie możemy wiarygodnie porównać dwóch liczb (która jest większa)? Nie możemy nawet łatwo odpowiedzieć na pytanie „Czy podana liczba jest równa 0?”.

Jeśli szukasz bardziej precyzyjnych matematycznych definicji i problemów, poszukaj liczb wymiernych, liczb transcendentalnych, najlepszych przybliżeń i twierdzenia Baire'a.


Myślę, że to świetna odpowiedź, ale nie na to pytanie, o ile nie jestem pewien, że pytający zrozumie twoje uwagi. To, a ty jesteś dość płynny z niedokładną reprezentacją \ liczb rzeczywistych lub \ złożonych przez skończoną cyfrową reprezentację (niezależnie od dynamicznej lub statycznej szerokości bitów). To wszystko całkowicie prawda, ale poza tym. Wyrazy uznania dla nie -robotowego sojusznika powołującego się na Goldberga :) A twierdzenie Baire'a nie jest częścią zwykłej retoryki znalezionej u Programistów lub StackOverflow.
mctylr

0

Dlatego

1) Autorzy przyjmują założenia, że ​​„obliczenia inżynierskie i naukowe” mierzą wielkości fizyczne w świecie rzeczywistym

2) Ilości fizyczne są ciągłe i dokładnie tak, jak podajesz „liczby zmiennoprzecinkowe pozwalają modelować wielkości ciągłe”

.. a resztę mojej odpowiedzi ładnie podsumował Rufflewind , więc nie zamierzam tego tutaj powtarzać.


0

Liczby zmiennoprzecinkowe zapewniają względną dokładność: mogą reprezentować liczby, które są co najwyżej małym procentem (jeśli chcesz zadzwonić np. O 0,0000000000001% procent) od dowolnej dokładnej liczby w szerokim zakresie liczb. Dzielą tę cechę z regułą suwaka, choć ta ostatnia nie jest lepsza niż 3 cyfry dokładności. Nadal wystarczało to do obliczenia sił statycznych i dynamicznych dużych struktur, zanim komputery cyfrowe stały się do tego powszechne, a to dlatego, że stałe materiałowe również wykazują pewne różnice, a wybieranie konstrukcji, które są względnie łagodne względem różnic materiałowych i konstrukcyjnych, będą miały tendencję aby racjonalnie można było zidentyfikować maksymalne obciążenia i słabe punkty.

Teraz „dokładność” jest przydatną funkcją dla wielu liczb reprezentujących pomiary i / lub wielkości właściwości fizycznych.

Nie wszystko w nauce / inżynierii należy do tej kategorii. Na przykład, jeśli używasz transformacji teoretycznych do mnożenia dużych liczb lub pól Galois do manipulowania wielomianami z korekcją błędów, nie ma czegoś takiego jak mały błąd: jakikolwiek błąd jednego bitu podczas przetwarzania doprowadzi do wyników, które są zupełnie nie do odróżnienia od całkowicie losowych hałas.

Nawet w tych obszarach można pracować z liczbami zmiennoprzecinkowymi (np. Stosując złożone FFT do wykonania splotu), jeśli śledzi się nagromadzenie błędów i upewnia się, że błędy zmiennoprzecinkowe nie kumulują się na tyle, aby możliwe było nawet odwrócenie jednego bitu rzeczywiste byty, których są przybliżeniami. Dla takich aproksymacji przetwarzanie stałoprzecinkowe byłoby prawdopodobnie bardziej odpowiednie, ale jednostki zmiennoprzecinkowe w terenie zwykle zapewniają szybszą pracę i większą liczbę użytecznych bitów.

Również języki programowania, takie jak C lub Fortran, sprawiają, że zaskakująco trudno jest uzyskać dostęp do podstawowych operacji, takich jak mnożenie i dzielenie z precyzją mieszaną lub bit przenoszenia dla dodawania / odejmowania, a są to podstawowe elementy składowe wychodzące poza liczby całkowite o ograniczonej precyzji.

Jeśli więc możesz odwzorować operacje na liczby zmiennoprzecinkowe, masz obecnie do dyspozycji dość potężny sprzęt i możesz dość dobrze określić swoje algorytmy w jednym z dzisiejszych języków programowania ogólnego przeznaczenia.


0

Myślę, że można na to odpowiedzieć, zwracając uwagę na typy aplikacji float/ doubledanych, które nie są odpowiednie.

Jeśli musisz upewnić się, że możesz dokładnie przedstawić liczbę za pomocą określonej liczby cyfr, liczby zmiennoprzecinkowe są nieodpowiednie, ponieważ reprezentują liczby jako potęgi 2, a nie potęgi 10, tak jak reprezentujemy liczby w realny świat.

Tak więc jedną domeną, w której nie należy stosować typów danych zmiennoprzecinkowych, jest finanse *. W przypadku podstawowego systemu np. Banku byłoby całkowicie niedopuszczalne, gdyby kwota, która powinna wynosić 100 000,01 USD, nagle stała się 100 000,00 USD lub 100 000,02 USD.

Taki problem może łatwo wystąpić przy stosowaniu liczb zmiennoprzecinkowych, zwłaszcza jeśli liczba była wynikiem jednego lub więcej obliczeń, np. Obliczenia sumy wszystkich transakcji na rachunku.

Inżynieria i obliczenia naukowe to dziedziny, w których te stosunkowo małe błędy zaokrąglania są dopuszczalne. Użytkownicy są zwykle świadomi, że wszystkie liczby mają ograniczoną precyzję i często pracują z wieloma cyframi znaczącymi . Ale co najważniejsze, mają one dokładnie określoną względną precyzję, tj. Podają taką samą liczbę cyfr znaczących, zarówno dla bardzo dużych liczb, jak i dla bardzo małych liczb.

* Kiedyś pracowałem nad aplikacją finansową, w której floats były używane do reprezentowania wartości, iw konsekwencji wprowadzono błędy zaokrąglania. Na szczęście ten konkretny błąd w ogóle nie był krytyczny, użytkownicy narzekali na błędy obliczeniowe w programie. Doprowadziło to do innego, znacznie gorszego efektu: użytkownicy zaczęli tracić wiarę w system.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.