• 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

Konkurs Mistrz Programowania
+2 głosów
365 wizyt
pytanie zadane 5 czerwca 2024 w C i C++ przez kacper1445 Mądrala (5,070 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 czerwca 2024 przez niezalogowany
fakt masz tylko 64 bity jak pamieta, wiec nie licz na giga liczby

2 odpowiedzi

+1 głos
odpowiedź 5 czerwca 2024 przez adrian17 Mentor (354,880 p.)
wybrane 6 czerwca 2024 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 2024 przez WojAbuk Gaduła (3,380 p.)
Flout32 ma siedem z kawałkiem cyfr precyzji.
komentarz 5 czerwca 2024 przez adrian17 Mentor (354,880 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,597 wizyt
0 głosów
2 odpowiedzi 1,574 wizyt
0 głosów
2 odpowiedzi 1,307 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)

93,657 zapytań

142,577 odpowiedzi

323,100 komentarzy

63,175 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

Kursy INF.02 i INF.03
...