Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zmiana dokładności liczby zmiennoprzecinkowej.

Ostatnio zmodyfikowano 2012-12-09 17:58
Autor Wiadomość
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ź ;]
P-69348
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ę.
P-69356
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:
C/C++
#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" );
   
}
P-69366
kubawal
» 2012-11-16 15:42:52
narrow_cast<int> chyba zgłasza wyjątek, gdy dochodzi do zaokrąglenia
P-69378
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/ljYg4x
http://ideone.com/CMfLEe
Wypis 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 :)
P-69441
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.
P-69442
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ść.
P-69497
Mrovqa
» 2012-11-19 08:22:09
Skoro
Wiem jak są zapisywane liczby
 to dlaczego się dziwisz,
że 10*0.1 to nie 1 ;)
 ?? :)
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 :)
P-69526
« 1 » 2
  Strona 1 z 2 Następna strona