From 8bfe6636836c6efd623279748b78d47db0bd3170 Mon Sep 17 00:00:00 2001 From: hugogogo Date: Sat, 12 Feb 2022 21:17:35 +0100 Subject: [PATCH] ajout max for fixed point range --- d02/ex01/Fixed.cpp | 74 ++++++++++++++++++++++++++++++++++++--------- d02/ex01/Fixed.hpp | 21 +++++++------ d02/ex01/fixed | Bin 18768 -> 14720 bytes d02/ex01/main.cpp | 11 +------ 4 files changed, 73 insertions(+), 33 deletions(-) diff --git a/d02/ex01/Fixed.cpp b/d02/ex01/Fixed.cpp index 82b8f4b..00567bd 100644 --- a/d02/ex01/Fixed.cpp +++ b/d02/ex01/Fixed.cpp @@ -1,5 +1,9 @@ #include "Fixed.hpp" +/* + * function to print integers in binary + */ + void printBits(std::string before, unsigned int num) { int i = 0; @@ -12,51 +16,89 @@ void printBits(std::string before, unsigned int num) if (i % 8 == 0) std::cout << ' '; } - std::cout << "(" << num << ")" << '\n'; + std::cout << "(" << (signed int)num << ")" << '\n'; } -// default/parametric constructor -Fixed::Fixed( void ) : _value( 0 ) { +/* + * statics variables initialisation + * + * for MAX integer : + * 00000000 01111111 11111111 11111111 ( 8388607) (-1U >> (this->_frac +1)) + * <= ... >= + * 11111111 10000000 00000000 00000000 (-8388608) + * + */ + +int const Fixed::_frac = 8; +int const Fixed::_max = -1U >> (_frac +1); + +/* + * default constructor / copy constructor / destructor + */ + +Fixed::Fixed() : _value(0) { std::cout << "Default constructor called" << '\n'; return; } -// copy constructor -Fixed::Fixed( Fixed const & src ) { +Fixed::Fixed(Fixed const & src) { std::cout << "Copy constructor called" << '\n'; *this = src; return; } -// destructor Fixed::~Fixed( void ) { std::cout << "Destructor called" << '\n'; return; } -Fixed::Fixed( int integer ) { +/* + * int and float constructors + */ - std::cout << integer << '\n'; - printBits("integer : ", integer); +Fixed::Fixed(int integer) { + std::cout << "Int constructor called" << '\n'; + + if (integer < ~this->_max || integer > this->_max) + { + std::cout << "error: integer out of range" << '\n'; + return; + } + printBits("integer : ", integer); this->_value = integer << this->_frac; - printBits("this->_value : ", this->_value); + printBits("integer : ", this->_value); +} + +Fixed::Fixed(float const floater) { + std::cout << "Float constructor called" << '\n'; + + if (floater < ~this->_max || floater > this->_max) + { + std::cout << "error: float out of range" << '\n'; + return; + } + } -// assignement operator -Fixed & Fixed::operator=( Fixed const & rhs ) { +/* + * assignement operator + */ +Fixed & Fixed::operator=( Fixed const & rhs ) { std::cout << "Copy assignment operator called" << '\n'; if ( this != &rhs ) this->_value = rhs.getRawBits(); return *this; - } +/* + * other functions + */ + int Fixed::getRawBits( void ) const { std::cout << "getRawBits member function called" << '\n'; - return this->_value; } @@ -64,3 +106,7 @@ void Fixed::setRawBits( int const raw ) { this->_value = raw; } +void Fixed::toFloat( void ) const {} +int Fixed::toInt( void ) const { + return 0; +} diff --git a/d02/ex01/Fixed.hpp b/d02/ex01/Fixed.hpp index 5224527..5b5e594 100644 --- a/d02/ex01/Fixed.hpp +++ b/d02/ex01/Fixed.hpp @@ -8,21 +8,24 @@ class Fixed { public: - Fixed( void ); // default/parametric constructor - Fixed( Fixed const & src ); // copy constructor - ~Fixed( void ); // destructor - Fixed( int integer); - Fixed( float const floater ); + Fixed(void); // default/parametric constructor + Fixed(Fixed const & src); // copy constructor + ~Fixed(void); // destructor + Fixed(int integer); + Fixed(float const floater); - Fixed & operator=( Fixed const & rhs ); // assignement operator + Fixed & operator=(Fixed const & rhs); // assignement operator - int getRawBits( void ) const; - void setRawBits( int const raw ); + int getRawBits(void) const; + void setRawBits(int const raw); + void toFloat(void) const; + int toInt(void) const; private: int _value; - static int const _frac = 8; + static int const _frac; + static int const _max; }; diff --git a/d02/ex01/fixed b/d02/ex01/fixed index 7caafdb07cfdc54ae9d2ce9baf621f575e3bc6bf..7a4f4017406a186ef6c789a0be21e61d461de461 100755 GIT binary patch literal 14720 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 literal 18768 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