Rzutowanie float na int i problemy z warunkiem
Ostatnio zmodyfikowano 2013-06-30 00:33
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: float n = 0.1; 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 |
|
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. |
|
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 ? :) |
|
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 |
|
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ź :) |
|
« 1 » |