• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

float nie zaokrągla wyników

Object Storage Arubacloud
0 głosów
182 wizyt
pytanie zadane 12 grudnia 2016 w C i C++ przez 87kelthuzad Obywatel (1,270 p.)

Witam pisze program który liczbę zmienno przecinkowa zamienia na kod szesnastkowy. Ale mam pewien problem z obliczenie części ułamkowej na kod binarny. W internecie znalazłem kilka filmów które mi pomogły z tym zagadnieniem (bo wcześniej nie wiedziałem jak ugryź temat) i w tym filmiku był przykład 5.2 i przedstawienie liczby 0.2 w binarce to 0011 i tak w nieskończoność (odsyłam do filmu https://www.youtube.com/watch?v=n-XozGu1viM) ale u mnie program jak mnoży 0.4 * 2.0 to mam jakieś 0.7999999 a nie 0.8 i tak dalej i w pewnym miejscy program się kończy bo otrzymuje 1 a nie powinien. Wynik poprawny to 00110011001100110011001 a u mnie jest 00110011001100110011. 

 /* Program to converter floating number to hexadecimal code */
#include <iostream>
#include <cmath>
#include <iomanip>
 
void printfloat(float);
 
int main()
{
    float number = 0.0;
    int  how_many_step = 0;
    std::cin >> how_many_step;
    while (how_many_step > 0)
    {
        std::cin >> number;
        printfloat( number );
        --how_many_step;
    }
    return 0;
}
 
void printfloat(float n)
{
    std::string s_intiger_part;
    std::string s_decimal_part;
    std::string final_binary;
    int binary_intiger[8] {};
    int binary_decimal[8] {};
    float intiger_part = 0.0;                   //czesc calkowita
    float decimal_part = 0.0;                   //czesc ulamkowa
    decimal_part = std::modf( n , &intiger_part );
    std::cout <<  "czesc calkowita" << intiger_part << " czesc ulamkowa " << decimal_part << std::endl;
    int intiger_number = intiger_part;
 
    int index = 0;
    do
    {
        if( intiger_number % 2 == 0 )
        {
            std::cout << "mod 0" << std::endl;
            s_intiger_part += std::to_string(0);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
        if ( intiger_number % 2 == 1)
        {
            std::cout << "mod 1" << std::endl;
            s_intiger_part += std::to_string(1);
            intiger_number /= 2;
            if ( intiger_number == 1 )
                ++index;
        }
    }
    while ( index != 1 );
    for ( int i = s_intiger_part.size() ; i >= 0 ; --i )
    {
        std::cout << "dana liczba: " << s_intiger_part[i] << std::endl;
        final_binary += s_intiger_part[i];
    }
    final_binary += ".";
    index = 0;
    std::cout << "liczba: " <<  intiger_part << " w binarnym to: " << s_intiger_part << std::endl;
    std::cout << "liczba: " <<  intiger_part << " w binarnym to: " << final_binary << std::endl;
    intiger_number = 0;
    float decimal = decimal_part;
    do
    {
        decimal *= 2.0;
        std::cout.setf(std::ios::basefield , std::ios::fixed );
        std::cout.precision(4);
        std::cout <<  "decimal: " << decimal << std::endl;
        std::cout << "binarka: " <<  s_decimal_part << std::endl;
        if ( decimal > 1 )
        {
            s_decimal_part += std::to_string(1);
            decimal -= 1;
        }
        else if ( decimal > 0 && decimal < 1 )
            s_decimal_part += std::to_string(0);
        else if ( decimal == 1 || decimal == 0 )
        {
            if ( decimal == 1 )
                s_decimal_part += std::to_string(1);
            else if ( decimal == 0 )
                s_decimal_part += std::to_string(0);
            ++index;
        }
        std::cout << "binarka: " <<  s_decimal_part << std::endl;
 
 
    }
    while ( index != 1 );
    std::cout << "czesc ulamkowa: " << decimal_part << " w binarnym to: " << s_decimal_part << std::endl;
}

a ty napisze co mi wipisuje konsola:

4
5.2
czesc calkowita5 czesc ulamkowa 0.2
mod 1
mod 0
mod 1
dana liczba: 
dana liczba: 1
dana liczba: 0
dana liczba: 1
liczba: 5 w binarnym to: 101
liczba: 5 w binarnym to: 101.
decimal: 0.4
binarka: 
binarka: 0
decimal: 0.8
binarka: 0
binarka: 00
decimal: 1.6
binarka: 00
binarka: 001
decimal: 1.2
binarka: 001
binarka: 0011
decimal: 0.4
binarka: 0011
binarka: 00110
decimal: 0.8
binarka: 00110
binarka: 001100
decimal: 1.6
binarka: 001100
binarka: 0011001
decimal: 1.2
binarka: 0011001
binarka: 00110011
decimal: 0.3999
binarka: 00110011
binarka: 001100110
decimal: 0.7998
binarka: 001100110
binarka: 0011001100
decimal: 1.6
binarka: 0011001100
binarka: 00110011001
decimal: 1.199
binarka: 00110011001
binarka: 001100110011
decimal: 0.3984
binarka: 001100110011
binarka: 0011001100110
decimal: 0.7969
binarka: 0011001100110
binarka: 00110011001100
decimal: 1.594
binarka: 00110011001100
binarka: 001100110011001
decimal: 1.188
binarka: 001100110011001
binarka: 0011001100110011
decimal: 0.375
binarka: 0011001100110011
binarka: 00110011001100110
decimal: 0.75
binarka: 00110011001100110
binarka: 001100110011001100
decimal: 1.5
binarka: 001100110011001100
binarka: 0011001100110011001
decimal: 1
binarka: 0011001100110011001
binarka: 00110011001100110011
czesc ulamkowa: 0.2 w binarnym to: 00110011001100110011

 

2 odpowiedzi

0 głosów
odpowiedź 12 grudnia 2016 przez hoktaur Pasjonat (22,250 p.)
komentarz 13 grudnia 2016 przez 87kelthuzad Obywatel (1,270 p.)
Dzieki za filmiki ale nie dokonca rozwiazuja moj problem chociaz bardzo mi sie przydaly do innych zadan. Do zaokraglenia float znalazlem ceil oraz round ale je trzeba caly czas dzielic przez 10 100 1000 i tak dalej i jak sprawdzilem w kondzie nie jest takie latwe nie ma innego rozwiazania?
0 głosów
odpowiedź 13 grudnia 2016 przez 87kelthuzad Obywatel (1,270 p.)
Do zaokraglenia float znalazlem ceil oraz round ale je trzeba caly czas dzielic przez 10 100 1000 i tak dalej i jak sprawdzilem w kondzie nie jest takie latwe nie ma innego rozwiazania?

Podobne pytania

0 głosów
1 odpowiedź 442 wizyt
pytanie zadane 25 marca 2020 w C i C++ przez Atman Użytkownik (810 p.)
0 głosów
1 odpowiedź 352 wizyt
pytanie zadane 11 marca 2016 w C i C++ przez m_rij_v Użytkownik (660 p.)
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 22 sierpnia 2017 w HTML i CSS przez HeroGames Początkujący (380 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...