wojciechoslaw Temat założony przez niniejszego użytkownika |
Zmiana dokładności liczby zmiennoprzecinkowej. » 2012-11-15 22:32:42 Witam. Da się zmienić dokładność liczby, nie przy wypisywaniu liczby, ale ogólnie zmiennej, do np. 1 miejsca po przecinku. Z góry dzięki za odpowiedź ;] |
|
Mrovqa |
» 2012-11-16 08:21:55 Możesz stworzyć własną klasę do tego. Po tym pytaniu domyślam się, iż jesteś początkujący - możesz tę liczbę po prostu zaokrąglić. Jeśli sprawa idzie o problem z Twojego* wcześniejszego tematu - if( wczytana -( int ) wczytana == 0.) cout << "liczba calkowita"; przy czym zmienna wczytana jest typu zmiennoprzecinkowego. *mój błąd, pomyliłem się. |
|
ison |
» 2012-11-16 14:21:56 if( wczytana -( int ) wczytana == 0.) cout << "liczba calkowita"; przy czym zmienna wczytana jest typu zmiennoprzecinkowego.
|
to nie jest dobra metoda sprawdzania czy liczba jest całkowita, zobacz co wypisze ten program: #include <cstdio>
int main() { double a = 0.0; for( int i = 0; i < 10; ++i ) a += 0.1; if( a -( int ) a == 0.) printf( "TAK\n" ); else printf( "NIE\n" ); }
|
|
kubawal |
» 2012-11-16 15:42:52 narrow_cast<int> chyba zgłasza wyjątek, gdy dochodzi do zaokrąglenia |
|
Mrovqa |
» 2012-11-17 22:33:14 @ison Wiesz o tym, że nie każda wartość jest kodowana, nieprawdaż? Po 10 obiegach Twojej pętli uzyskujemy 0.99999999999999989, co liczbą całkowitą nie jest. Sprawdzane debuggerem Visual C++ 2010. Co ciekawe: http://ideone.com/ljYg4xhttp://ideone.com/CMfLEeWypis wartości zmiennej zmienia jej wartość... Sprawdziłem - w przypadku Visuala jest normalnie, ale w przypadku MinGW jest trochę inaczej... Zdziwiło mnie to, iż Eclipse i CodeBlocks korzystające z tego samego MinGW dawało różne wyniki. Problem tkwi w optymalizacji -O2 zaokrągla, a -O3 zachowuje się na tyle dziwnie, że na outpucie jest -1... Gdybym miał więcej czasu pobawiłbym się debuggerem; na razie tyle opiszę :) Zapewne jakieś UB albo założenie optymalizacji. Wniosek? Pomysł z tym odejmowaniem nie jest najlepszym pomysłem na sprawdzanie całkowitości liczby. "Na logikę" można tego wymyślić dziesiątki sposobów, jednakże na razie się wstrzymam z nieprzetestowanymi sposobami, zwłaszcza, iż nie o tym jest ten temat :) |
|
m4tx |
» 2012-11-17 22:45:52 to nie jest dobra metoda sprawdzania czy liczba jest całkowita, zobacz co wypisze ten program: |
Jest taki dowcip: Pewien programista miał problem. Chciał go rozwiązać używając floata. Teraz ma 1,999999997 problemów. |
(pewnie coś pokręciłen, pisane z pamięci) To samo jest z double. |
|
ison |
» 2012-11-18 17:49:52 @ison Wiesz o tym, że nie każda wartość jest kodowana, nieprawdaż? Po 10 obiegach Twojej pętli uzyskujemy 0.99999999999999989, co liczbą całkowitą nie jest. Sprawdzane debuggerem Visual C++ 2010. Co ciekawe:
|
Wiem jak są zapisywane liczby, dałem jedynie przykład, na który nie jest odporny Twój program, chyba że uważasz, że 10*0.1 to nie 1 ;) Najlepszym sposobem jest skorzystanie z jakiegoś przybliżenia if( fabs( a ) < eps ) Zapewne jakieś UB albo założenie optymalizacji.
|
UB to to nie jest, co najwyżej optymalizator może wywalić pętlę i zamienić ją na a += 1.0 Zwracana jest wartość false, gdyż 0.1 w systemie binarnym musi być zapisana używając okresu - wtedy tracisz dokładność. |
|
Mrovqa |
» 2012-11-19 08:22:09 Skoro Wiem jak są zapisywane liczby |
to dlaczego się dziwisz, ?? :) Odporność mojego kodu? To było rozwiązanie napisane w 10sek, nieprzemyślane. Oczywiście - najlepiej użyć jakiegoś jak pisałeś przybliżenia - biorąc pod uwagę to, iż między 0. a 1. jest dużo więcej kodowanych liczb niż między takimi 10000000. a 10000001. :) @down wiesz, ja miałem na myśli kodowanie liczb w komputerze (bo o tym mowa w tym temacie), a nie to, jak jest w matematyce. Dobra, temat można skończyć, bo dalej to zapewne nic nowego się nie rzeknie, a "dyskusji" tu nie chcemy :) |
|
« 1 » 2 |