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

Inkrementacja zmiennej typu float miliard razy

Object Storage Arubacloud
+1 głos
317 wizyt
pytanie zadane 12 marca 2022 w C i C++ przez Bilib Użytkownik (990 p.)

Do rozważenia jest poniższy, prosty program w języku C:

#include <stdio.h>
int main()
{
   float n=0;
   for(unsigned i=0; i<1000000000; i++) n++;
   printf("%f", n);
}

Oczywiście ze względu na specyfikę typu float (4-bajtowa liczba zmiennoprzecinkowa pojedynczej precyzji) nie otrzymujemy oczekiwanego 1000000000, a liczbę 16777216 (co jest równe 2^24 - czy to powinno mnie o czymś informować? znak, cecha, mantysa?). Myślę, że inkrementacja przebiega dokładnie miliard razy, natomiast dla typu float nie jesteśmy w stanie do liczby większej niż 16777216 dodać tak małą liczbę jak 1 - więc mamy do czynienia z pewną niedokładnością (czy zaokrąglaniem; jedynka dodaje się cały czas, ale jednak nie dodaje się :P).

Czy można to w jakiś sposób "oszukać", aby otrzymać wynik 1000000000 przy jednoczesnym zachowaniu zmiennej n jako typ float oraz jej inkrementacji dokładnie miliard razy?

komentarz 12 marca 2022 przez VBService Ekspert (253,100 p.)
edycja 12 marca 2022 przez VBService

Tak, tylko pytam, skoro chcesz dodawać 1 (jeden) nie 1.01, to po co komplikować i nie użyć int-a. wink

 

P.S

[ on-line ]

#include <stdio.h>
int main()
{
   double n=0;
   for(unsigned i=0; i<1000000000; i++) n++;
   printf("%f", n);
}

 

2
komentarz 12 marca 2022 przez Oscar Nałogowiec (29,290 p.)

@Bilib,  dobrze myślisz. Gdy osiąga się pełną "pojemność" mantysy, zwiększa się cecha i traci się najmłodszy bit mantysy, w tym momencie odpowiadający jednostkom. Dodanie jeden po prostu nic nie zmieni. Tym się charakteryzują liczby zmiennoprzecinkowe - obliczenia na intach są albo dokładne albo zupełnie bez matematycznego sensu (przepełnienie), obliczenia na floatach trudniej się przepełniają, ale są przybliżone, stąd np. dodanie liczby małej do dużej, gdy ta mała < dokładność reprezentacji tej dużej powoduje taki skutek. Jak wykonasz przybliżone obliczenia miliard razy błąd może być znaczny.

komentarz 13 marca 2022 przez Bilib Użytkownik (990 p.)

@VBService, cała magia ma właśnie polegać na tym, aby zachować typ zmiennej n na float, a nie zmieniać na double lub int, ale dziękuję za odpowiedź.

1
komentarz 13 marca 2022 przez Bilib Użytkownik (990 p.)

@Oscar, tak właśnie myślałem. Wygląda na to, że nie da rady nic więcej z tym zrobić. Dzięki za odpowiedź.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+2 głosów
2 odpowiedzi 392 wizyt
pytanie zadane 10 marca 2022 w C i C++ przez Bilib Użytkownik (990 p.)
0 głosów
2 odpowiedzi 1,331 wizyt
pytanie zadane 7 listopada 2022 w Python przez niezalogowany
0 głosów
0 odpowiedzi 316 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Mavimix Dyskutant (8,390 p.)

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...