float na int z przesunięciem przecinka
Ostatnio zmodyfikowano 2015-03-06 16:35
4th_hokage Temat założony przez niniejszego użytkownika |
float na int z przesunięciem przecinka » 2015-03-03 15:46:57 Witam, piszę program w C++ i natrafiłem na problem. Mianowicie mam zmienną float o wartości 54.373657 i chciałbym z niej uzyskać zmienną int o wartości 54373657. Moje podejście było takie: float f = 54.373657; int i = static_cast < int >( f * 1000000 );
Niestety w efekcie dostaje wynik i = -21224... zakres int powinien spokojnie pomieścić taką liczbę, a zakres to jedyne co mi przyszło do głowy jako potencjalny problem. Z góry dziękuję za wszelką pomoc. |
|
Monika90 |
» 2015-03-03 17:10:12 W ogólnym przypadku to się przecinka dziesiętnego przesunąć po prostu nie da. Ale nie jest też możliwe by wynikiem było -21224..., więc błąd jest gdzie indziej.
|
|
Brunon3 |
» 2015-03-03 17:22:40 Może użyj unsigned long long int ? Bo z tego co zrozumiałem to w int się nie mieści. |
|
aksen |
» 2015-03-03 17:42:58 Działa poprawnie. Może pokaż fragment programu w którym tego używasz. Skąd masz taki wynik? |
|
4th_hokage Temat założony przez niniejszego użytkownika |
» 2015-03-03 20:54:48 Więc sytuacja wymaga dodatkowych wyjaśnień. Ta zmienna float to wynik, który przekazuje do mikrokontrolera moduł GPS, jest to po prostu szerokość geograficzna. Potrzebuje tej zmiennej w formie całkowitoliczbowej, żeby przesłać ją do kolejnego mikrokontrolera, który z kolei wyświetla go na wyświetlaczu LCD. int main( void ) { float fLongitude, fLatitude; int dLongitude, dLatitude; char buffer[ 28 ]; while( 1 ) { if( nmea.isdataready() ) { fLatitude = nmea.getLatitude() * 1000000; dLatitude = static_cast < int >( fLatitude ); fLongitude = nmea.getLongitude() * 1000000; lcd_gotoxy( 0, 0 ); sprintf( buffer, "%d", dLatitude ); lcd_puts( buffer ); } else { lcd_clrscr(); lcd_gotoxy( 0, 0 ); lcd_puts( "Not ready!" ); } } }
Powyższy kod przedstawia część kodu. nmea.getLatitude() zwraca we floatcie ostatnią szerokość geograficzną z GPS. Rzutuję ją na int(co sprawdziłem na komputerze i rzeczywiście zwraca wynik taki jaki chcę). Następnie potrzebuję mieć ten int w tablicy char, żeby go wyświetlić na wyświetlaczu(wyświetlacz przyjmuje tylko ten typ zmiennych). Do tej pory wyświetlałem dane za pomocą funkcji itoa() i wszystko działało, spróbowałem jeszcze sprintf(), ale daje ten sam rezultat co itoa(), czyli zły... Jakieś sugestie?:( Powiedzcie, czy może gdzieś nie ma jakiegoś głupiego błędu. |
|
Monika90 |
» 2015-03-03 21:15:39 Może int jest 16 bitowe |
|
Brunon3 |
» 2015-03-03 21:37:48 Na Wikipedii jest napisane, że we "współczesnych kompilatorach" int ma 32 bity, tyle samo co long int. |
|
Piastlis |
» 2015-03-03 21:38:18 Sprawdź jaki zakres ma u ciebie int.Jeżeli jest 16bit to max 32767, jeżeli 24bit to 16777215 a 32bit to 2147483647. Z tego co piszesz masz int 16 bitów czyli 4 pozycje znaczące.Jeżeli to za mało musisz pisać tę liczbę "po kawałku". |
|
« 1 » 2 |