From 3e92c847fae661d6c24a263cc49308ecff69cc9d Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Tue, 15 Feb 2022 15:20:55 +0100 Subject: [PATCH] modif readme binary conversions recuperation methode deplacement binaires, extrait fonctions printBits dans fichier a part --- d02/README.md | 20 +++++++++++------ d02/ex01/Fixed.cpp | 50 +++++++---------------------------------- d02/ex01/Fixed.hpp | 3 ++- d02/ex01/fixed | Bin 0 -> 19088 bytes d02/ex01/main.cpp | 3 +++ d02/ex01/printBits.cpp | 37 ++++++++++++++++++++++++++++++ 6 files changed, 63 insertions(+), 50 deletions(-) create mode 100755 d02/ex01/fixed create mode 100644 d02/ex01/printBits.cpp diff --git a/d02/README.md b/d02/README.md index 935d869..8697f02 100644 --- a/d02/README.md +++ b/d02/README.md @@ -245,7 +245,7 @@ REPRESENTATION FLOATS vs INTEGERS --------------------------------------------------------- ``` -integer : 1 (1) +integer : 1 (1) floater : 0 01111111 00000000000000000000000 (1) integer : 1010 (10) @@ -266,7 +266,7 @@ floater : 0 10000100 00010 100000000000000000 (34.5) 100010.100011001100110011 (34.55) floater : 0 10000100 00010 100011001100110011 (34.55) - 1.0001100110011001101 (1.1) + 1.0001100110011001101 (1.1) floater : 0 01111111 00011001100110011001101 (1.1) 100010.01 (34.25) @@ -291,7 +291,7 @@ par multiplications binaires : 100010.01000000 34.25 * 1 00000000.00000000 * 256.00 ----------------------- -------- - 100010 01000000.0 8768.00 + 100010 01000000 8768.00 34.25 * (1 << _frac) ``` @@ -301,10 +301,16 @@ par decalage binaire : 10000100 (132) decaler la virgule de 132 - 127 = 5 100010.01 (34.25) fixe -value = 34.25; -signe = (unsigned int)value; -exponent = ((unsigned int)(value << 1) >> 24) - 127; -fixedd = (unsigned int)(value << 9) >> (32 - exponent - 8); +this->_value = *((int *)&floater); // access float adress content as int +int sign = this->_value & (1 << 31); // extract sign +int exponent = ((unsigned int)(this->_value << 1) >> 24) - 127; // extract exponent +int integer = (this->_value << 8) | (1 << 31); // add left 1 +integer = (unsigned int)integer >> (31 - this->_frac - exponent);// align to right +if (sign != 0) + integer = (~integer + 1); // reverse negatif +integer = (integer << (30 - this->_frac - exponent)) | sign; // add sign +integer >>= (30 - this->_frac - exponent); // align right +std::cout << "integer : " << printBitsInt(integer) << " (" << integer << ")\n"; ``` diff --git a/d02/ex01/Fixed.cpp b/d02/ex01/Fixed.cpp index 0b1d00b..6b16de2 100644 --- a/d02/ex01/Fixed.cpp +++ b/d02/ex01/Fixed.cpp @@ -1,39 +1,5 @@ #include "Fixed.hpp" - -/* - * functions to print numbers in binary - * for the float, found help from stackoverflow : - * https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec - */ - -std::string printBitsInt(int num) -{ - int i = 0; - - for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1) - { - std::cout << ((num & mask) != 0); - i++; - if (i == 1 || i == 9 || i == 24) - std::cout << ' '; - } - return ""; -} - -std::string printBitsFloat(float num) -{ - int *p = (int *)# - int i = 0; - - for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1) - { - std::cout << ((*p & mask) != 0); - i++; - if (i == 1 || i == 9 || i == 24) - std::cout << ' '; - } - return ""; -} +#include "printBits.cpp" /* * statics variables initialisation @@ -41,12 +7,13 @@ std::string printBitsFloat(float num) * for MAX integer : * 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1)) * <= ... >= - * 11111111 10000000 00000000 00000000 (-8388608) - * + * 11111111 10000000 00000000 00000000 (-8388608) ~MAX + * */ int const Fixed::_frac = 8; -int const Fixed::_max = -1U >> (_frac +1); +int const Fixed::_fmax = -1U >> (_frac +1); +int const Fixed::_fmin = ~_fmax; /* * default constructor / copy constructor / destructor @@ -75,7 +42,7 @@ Fixed::~Fixed( void ) { Fixed::Fixed(int integer) { std::cout << "Int constructor called" << '\n'; - if (integer < ~this->_max || integer > this->_max) + if (integer < this->_fmin || integer > this->_fmax) std::cout << "error: integer out of range" << '\n'; else this->_value = integer << this->_frac; @@ -84,10 +51,10 @@ Fixed::Fixed(int integer) { Fixed::Fixed(float const floater) { std::cout << "Float constructor called" << '\n'; - if (floater < ~this->_max || floater > this->_max) + if (floater < this->_fmin || floater > this->_fmax) std::cout << "error: float out of range" << '\n'; else - this->_value = floater * (1 << this->_frac); + this->_value = roundf(floater * (1 << this->_frac)); } /* @@ -122,7 +89,6 @@ float Fixed::toFloat( void ) const { /* * overload "<<" -> output fixed point in float representation - * took here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp */ std::ostream & operator<<(std::ostream & o, Fixed const & rhs) diff --git a/d02/ex01/Fixed.hpp b/d02/ex01/Fixed.hpp index 84f09bd..aab1d17 100644 --- a/d02/ex01/Fixed.hpp +++ b/d02/ex01/Fixed.hpp @@ -26,7 +26,8 @@ private: int _value; static int const _frac; - static int const _max; + static int const _fmax; + static int const _fmin; }; diff --git a/d02/ex01/fixed b/d02/ex01/fixed new file mode 100755 index 0000000000000000000000000000000000000000..ee017d61354e87d9ef4b7a738f3f2a5c913593d3 GIT binary patch literal 19088 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 VWm&q-7t?>e(UdsDq2NHp{{alDI`RMj literal 0 HcmV?d00001 diff --git a/d02/ex01/main.cpp b/d02/ex01/main.cpp index 13402e6..bfe96f4 100644 --- a/d02/ex01/main.cpp +++ b/d02/ex01/main.cpp @@ -1,6 +1,9 @@ #include "Fixed.hpp" #include +std::string printBitsFloat(float num); +std::string printBitsInt(int num); + int main( void ) { Fixed a; diff --git a/d02/ex01/printBits.cpp b/d02/ex01/printBits.cpp new file mode 100644 index 0000000..24b8f9b --- /dev/null +++ b/d02/ex01/printBits.cpp @@ -0,0 +1,37 @@ +#include + +/* + * functions to print numbers in binary + * for the float, found help from stackoverflow : + * https://stackoverflow.com/questions/474007/floating-point-to-binary-valuec + */ + +std::string printBitsInt(int num) +{ + int i = 0; + + for (unsigned int mask = 1U << (sizeof(int) *8 -1); mask; mask >>= 1) + { + std::cout << ((num & mask) != 0); + i++; + if (i == 1 || i == 9 || i == 24) + std::cout << ' '; + } + return ""; +} + +std::string printBitsFloat(float num) +{ + int *p = (int *)# + int i = 0; + + for (unsigned int mask = 1U << (sizeof(float) *8 -1); mask; mask >>= 1) + { + std::cout << ((*p & mask) != 0); + i++; + if (i == 1 || i == 9 || i == 24) + std::cout << ' '; + } + return ""; +} +