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

float na int z przesunięciem przecinka

Ostatnio zmodyfikowano 2015-03-06 16:35
Autor Wiadomość
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:
C/C++
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.
P-127588
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.

P-127590
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.
P-127592
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?
P-127598
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.
C/C++
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 );
            //itoa(dLatitude, buffer, 10);
            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.
P-127616
Monika90
» 2015-03-03 21:15:39
Może int jest 16 bitowe
P-127622
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.
P-127626
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".
P-127627
« 1 » 2
  Strona 1 z 2 Następna strona