• 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

Cloud VPS
+2 głosów
277 wizyt
pytanie zadane 5 czerwca 2024 w C i C++ przez kacper1445 Mądrala (5,050 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,120 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,280 p.)
Flout32 ma siedem z kawałkiem cyfr precyzji.
komentarz 5 czerwca 2024 przez adrian17 Mentor (354,120 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,451 wizyt
0 głosów
2 odpowiedzi 1,448 wizyt
0 głosów
2 odpowiedzi 1,203 wizyt
pytanie zadane 19 stycznia 2020 w C i C++ przez xZenit Użytkownik (760 p.)

93,453 zapytań

142,448 odpowiedzi

322,717 komentarzy

62,831 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
...