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