• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błędny wynik dzielenia liczb zmiennoprzecinkowych

Object Storage Arubacloud
+2 głosów
106 wizyt
pytanie zadane 5 czerwca w C i C++ przez kacper1445 Mądrala (5,030 p.)

Hej, wiedziałem od dłuższego czasu, że komputer ma czasami problem z działaniami na liczbach zmiennoprzecinkowych, ale nie sądziłem że aż takie.

int main()
{
    std::cout << std::fixed << std::numeric_limits<float>::max() / 1.33;
}
Program wypisuje: 255851388450021679222896149935717089280.000000
Poprawny wynik:   255851388450021699106544498860539041684.210526

Wytłumaczy mi ktoś dlaczego tak się dzieje i w jaki sposób mogę bronić się przed tego typu złymi wynikami?

komentarz 6 dni temu przez Mist Obywatel (1,550 p.)
fakt masz tylko 64 bity jak pamieta, wiec nie licz na giga liczby

2 odpowiedzi

+1 głos
odpowiedź 5 czerwca przez adrian17 Ekspert (346,840 p.)
wybrane 6 dni temu przez kacper1445
 
Najlepsza

komputer ma czasami problem z działaniami na liczbach zmiennoprzecinkowych

Nie chodzi o to że "ma problemy", tylko z natury nie możesz zapakować nieskończenie wielu wartości o nieograniczonej precyzji w stałym, niewielkim (64 bity) rozmiarze natywnej liczby zmiennoprzecinkowej.

ale nie sądziłem że aż takie

Różnica jest rzędu 0.00000000000001%.

i w jaki sposób mogę bronić się przed tego typu złymi wynikami?

Jeśli chcesz wykonywać z dowolną precyzją operacje na dowolnie dużych liczbach (jak u Ciebie, rzędu 10**38), jedyną opcją jest użycie dedykowanej do tego biblioteki, jak boost::multiprecision:

https://live.boost.org/doc/libs/1_85_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/cpp_dec_float.html

0 głosów
odpowiedź 5 czerwca przez WojAbuk Obywatel (1,120 p.)
Flout32 ma siedem z kawałkiem cyfr precyzji.
komentarz 5 czerwca przez adrian17 Ekspert (346,840 p.)
(jakby co: masz rację, ale w tym konkretnym przypadku operacje działały na double'ach.)

Podobne pytania

0 głosów
1 odpowiedź 3,157 wizyt
0 głosów
2 odpowiedzi 1,112 wizyt
0 głosów
2 odpowiedzi 844 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)

92,752 zapytań

141,666 odpowiedzi

320,385 komentarzy

62,100 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...