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

Rzutowanie float na int i problemy z warunkiem

Ostatnio zmodyfikowano 2013-06-30 00:33
Autor Wiadomość
Wasilek
Temat założony przez niniejszego użytkownika
Rzutowanie float na int i problemy z warunkiem
» 2013-06-30 00:00:33
Mam taki kod:
C/C++
float n = 0.1; // Każda liczba mieszcząca się w float i mniejsza od 1 tutaj może się znajdować
do
{
    n *= 10;
} while( static_cast < int >( n ) != n );


Ogólnie to zamiar był taki aby ta pętla przesunęła przecinek za wszystkie liczby - czyli tak jakby zmieniła liczbę na int.
Niestety nie wiem czemu mimo, że "static_cast<int>(n)!=n" jest takie same (według "cout << static_cast<int>(n) << "  " << n << endl; :) ) to pętla nie chce się zakończyć.
Podejrzewam, że źle korzystam z rzutowania (po 2 latach nadal takie problemy ... ;P)

Przykładowo w tym wypadku (n=0.1) wynikiem jest 1e+007.

Mógłby ktoś pomóc/doradzić? :)

Pozdrawiam
Wasil
P-86591
akwes
» 2013-06-30 00:08:43
Generalnie z floatem jest taki problem, że
float a = 0.001;
 nie oznacza, że w a jest wartość 0.001, być może będzie to 0.00010000001. Float nie zawiera dosłownie danej wartości lecz maksymalne możliwe dla niego przybliżenie czasami z akceptowalnym marginesem błędu :) Wynika to z tego, że nie wszystkie wartości ułamkowe da się ładnie przestawić w postaci zero-jedynkowej.
P-86592
Wasilek
Temat założony przez niniejszego użytkownika
» 2013-06-30 00:17:34
Czyli najlepiej byłoby dodać margines błędu (skoro mnożę przez 10 to mógłby być dość duży) czy jednak istnieje jakieś rozwiązanie ? :)
P-86593
abdi
» 2013-06-30 00:20:38
Hmm skoro pętla nie może się zakończyć to pewnie trzeba mienić warunek zamiast sprawdzać czy jest różna, sprawdzać czy jest większa.


no i to by miało sens ponieważ w przypadku np liczy 0.12 jeśli pomnożysz ją przez 10 to będziesz miał 1.2 i ta liczba nadal będzie różna od static_cast<int>(n) czyli 1 i pętla nadal się będzie wykonywać.

a przerywa wykonywanie w momencie kiedy float wychodzi poza zakres? chyba tak :P
http:scr.hu12i429wk2
P-86594
Wasilek
Temat założony przez niniejszego użytkownika
» 2013-06-30 00:33:16
Niestety nie pomogło.
Porzuciłem ten sposób i skorzystałem z całkiem innego rozwiązania(nie związanego z tematem).
Dzięki za odpowiedź :)
P-86595
« 1 »
  Strona 1 z 1