From 494cb84f1353a03cc72037c7f561f29b2bc835f1 Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Fri, 18 Feb 2022 17:48:54 +0100 Subject: [PATCH] d02 ex02 division avec long sans float --- "d02/ex02/\032make" | 238 ++++++++++++++++++++++++++++++++++++++++++++ d02/ex02/Fixed.cpp | 90 ++++------------- d02/ex02/main.cpp | 44 ++++---- d02/ex02/operators | Bin 45088 -> 44984 bytes 4 files changed, 281 insertions(+), 91 deletions(-) create mode 100644 "d02/ex02/\032make" diff --git "a/d02/ex02/\032make" "b/d02/ex02/\032make" new file mode 100644 index 0000000..e884f78 --- /dev/null +++ "b/d02/ex02/\032make" @@ -0,0 +1,238 @@ +#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 ""; +} + + +/* + * 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) { + return; +} + +Fixed::Fixed(Fixed const & src) { + *this = src; + return; +} + +Fixed::~Fixed( void ) { + return; +} + + +/* + * int and float constructors + */ + +Fixed::Fixed(int integer) { + if (integer < ~this->_max || integer > this->_max) + std::cout << "error: integer out of range" << '\n'; + else + this->_value = integer << this->_frac; +} + +Fixed::Fixed(float const floater) { + if (floater < ~this->_max || floater > this->_max) + std::cout << "error: float out of range" << '\n'; + else + this->_value = roundf(floater * (1 << this->_frac)); +} + + +/* + * assignement operator + */ + +Fixed & Fixed::operator=( Fixed const & rhs ) { + if ( this != &rhs ) + this->_value = rhs.getRawBits(); + return *this; +} + + +/* + * operators < ; > ; <= ; == ; != ; + ; - ; * ; / ; ++ ; -- + * ref : https://en.cppreference.com/w/cpp/language/operators + * for division, if you want to avoid floats (legitimate) : + * https://stackoverflow.com/questions/8506317/fixed-point-unsigned-division-in-c + */ + +bool Fixed::operator< (Fixed const & rhs) const { + return this->toFloat() < rhs.toFloat(); +} +bool Fixed::operator> (Fixed const & rhs) const { + return this->toFloat() > rhs.toFloat(); +} +bool Fixed::operator<=(Fixed const & rhs) const { + return this->toFloat() <= rhs.toFloat(); +} +bool Fixed::operator>=(Fixed const & rhs) const { + return this->toFloat() >= rhs.toFloat(); +} +bool Fixed::operator==(Fixed const & rhs) const { + return this->toFloat() == rhs.toFloat(); +} +bool Fixed::operator!=(Fixed const & rhs) const { + return this->toFloat() != rhs.toFloat(); +} +Fixed Fixed::operator+ ( Fixed const & rhs ) const { + Fixed result(*this); + result._value += rhs._value; + return (result); +} +Fixed Fixed::operator- ( Fixed const & rhs ) const { + Fixed result(*this); + result._value -= rhs._value; + return (result); +} +Fixed Fixed::operator* ( Fixed const & rhs ) const { + Fixed result(*this); + result._value = ((long)result._value * (long)rhs._value) >> 8; + return result; +} +Fixed Fixed::operator/ ( Fixed const & rhs ) const { + Fixed result(*this); + + while (result._value < (rhs._value << 8)) + result._value <<= 1; +// result._value /= rhs._value; + return result; + +// if (rhs._value >> _frac != 0) +// result._value /= rhs._value >> _frac; +// return result; + +// return Fixed( this->toFloat() / rhs.toFloat() ); + +// +// 10 / 5 = 2 +// 5 / 10 = 0.5 +// 10 / 6 = 1.666... +// 6 / 10 = 0.6 +// + +} +Fixed Fixed::operator++() { + this->_value++; + return *this; +} +Fixed Fixed::operator--() { + this->_value--; + return *this; +} +Fixed Fixed::operator++( int ) { + Fixed old = *this; + Fixed::operator++(); + return old; +} +Fixed Fixed::operator--( int ) { + Fixed old = *this; + Fixed::operator--(); + return old; +} + + +/* + * returns min and max + */ + +Fixed const & Fixed::min(Fixed const & lhs, Fixed const & rhs) { + if (lhs < rhs) + return lhs; + return rhs; +} +Fixed const & Fixed::max(Fixed const & lhs, Fixed const & rhs) { + if (lhs > rhs) + return lhs; + return rhs; +} +Fixed & Fixed::min(Fixed & lhs, Fixed & rhs) { + if (lhs < rhs) + return lhs; + return rhs; +} +Fixed & Fixed::max(Fixed & lhs, Fixed & rhs) { + if (lhs > rhs) + return lhs; + return rhs; +} + + +/* + * functions that returns _value + */ + +int Fixed::getRawBits( void ) const { + return this->_value; +} + +void Fixed::setRawBits( int const raw ) { + this->_value = raw; +} + +int Fixed::toInt( void ) const { + return (this->_value >> this->_frac); +} +float Fixed::toFloat( void ) const { + return ((float)this->_value / (float)(1 << this->_frac)); +} + + +/* + * overload "<<" -> output fixed point in float representation + * found here : https://github.com/pgomez-a/42_CPP_Piscine/blob/master/cpp02/ex01/Fixed.cpp + */ + +std::ostream & operator<<(std::ostream & o, Fixed const & rhs) +{ + o << rhs.toFloat(); + return (o); +} diff --git a/d02/ex02/Fixed.cpp b/d02/ex02/Fixed.cpp index ec5b6e8..42edded 100644 --- a/d02/ex02/Fixed.cpp +++ b/d02/ex02/Fixed.cpp @@ -135,80 +135,28 @@ Fixed Fixed::operator- ( Fixed const & rhs ) const { } Fixed Fixed::operator* ( Fixed const & rhs ) const { Fixed result(*this); - int left = this->_value; - int right = rhs._value; - - result._value = 0; - // left:5 right:10 - while (right > 0) // 1 - { - result._value /= 10; // 0/10 = 0 0/10 = 0 - result._value += (left * (right % 10)); // 0+(5*0) = 0 0+(5*1) = 1 -std::cout << "intermediaire: " << result << " "; // - right /= 10; // 10/10 = 1 1/10 = 0 - } - result._value >>= _frac; - -// result._value *= rhs._value >> _frac; -// result._value += (this->_value * (rhs._value & ((1 << (_frac + 1)) - 1))) >> _frac; - -// result._value = ((long)result._value * (long)rhs._value) >> 8; - + result._value = ((long)result._value * (long)rhs._value) >> 8; return result; - -// -// 47 * 256 = 12 032 -// 5 * 10 -> 5*256 * 10*256 -> 5 * 10 * 256^2 -// 256^2 = 65 536 -// 256 : 1 00000000 -// 65 536 : 1 00000000 00000000 -// -// -// 5 * 10 = 50 -// 101 * 1010 = 110010 -// 101.00000000 * 1010.00000000 = 110010.00000000 -// 101 00000000 * 1010 00000000 = 110010 00000000 -// 110010 00000000 -// 128 * 2560 = 327680 -// -// -// 3 * 5 = 15 -// 11 * 101 = 1111 -// -// -// 3.5 * 5.25 = 18.375 -// 11.1 * 101.01 = 10010.011 -// 11 1 * 101 01 = 10010 011 -// 7 * 21 = 147 -// -// -// 3.5 * 5.25 -// 3.5 * (5 + 0.25) -// 3.5 * 5 -// + 3.5 * 0.25 -// -// 3.5 * 4.25 = 14.875 -// 3.5 * (0.05 + 0.20 + 4.00) -// 3.5 * 0.05 = 0.175 = 17.5 / 100 -// 3.5 * 0.20 = 0.7 = 7 / 10 -// 3.5 * 4.00 = 14 -// 14 + 0.7 + 0.175 = 14.875 -// -// 3.5 * 5 = 17.5 -// 3.5 * 2 = 7 -// 3.5 * 4 = 14 -// (((17.5 / 10) + 7) / 10) + 14 -// 17.5 / 10 -// 1.75 + 7 -// 8.75 / 10 -// 0.875 + 14 -// - } Fixed Fixed::operator/ ( Fixed const & rhs ) const { - std::cout << this->_value << " " << rhs._value << " " - << (( (this->_value << 8) / rhs._value )) << "\n"; - return Fixed( this->toFloat() / rhs.toFloat() ); + Fixed result(*this); + + result._value = (long)(result._value << _frac) / rhs._value; + +// if (rhs._value >> _frac != 0) +// result._value /= rhs._value >> _frac; + + return result; + +// return Fixed( this->toFloat() / rhs.toFloat() ); + +// +// 10 / 5 = 2 +// 5 / 10 = 0.5 +// 10 / 6 = 1.666... +// 6 / 10 = 0.6 +// + } Fixed Fixed::operator++() { this->_value++; diff --git a/d02/ex02/main.cpp b/d02/ex02/main.cpp index 2c16034..26c54de 100644 --- a/d02/ex02/main.cpp +++ b/d02/ex02/main.cpp @@ -4,6 +4,7 @@ #include "color.h" #define COLOR B_YELLOW +#define COLOR2 B_CYAN int main( void ) { @@ -30,100 +31,103 @@ int main( void ) { // ">" std::cout << "\n" COLOR "operator >"" RESET " RESET "\n"; std::cout << "e = greater of (c, d) : e == " << (e = (c > d) ? c : d) << '\n'; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e > c ? : " << (e > c) << '\n'; std::cout << "e > d ? : " << (e > d) << '\n'; // "<" std::cout << "\n" COLOR "operator <" RESET "\n"; std::cout << "e = smaller of (c, d) : e == " << (e = (c < d) ? c : d) << '\n'; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e < c ? : " << (e < c) << '\n'; std::cout << "e < d ? : " << (e < d) << '\n'; // "<=" std::cout << "\n" COLOR "operator <=" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e <= c ? : " << (e <= c) << '\n'; std::cout << "e <= d ? : " << (e <= d) << '\n'; // ">=" std::cout << "\n" COLOR "operator >=" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e >= c ? : " << (e >= c) << '\n'; std::cout << "e >= d ? : " << (e >= d) << '\n'; // "==" std::cout << "\n" COLOR "operator ==" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e == c ? : " << (e == c) << '\n'; std::cout << "e == d ? : " << (e == d) << '\n'; // "!=" std::cout << "\n" COLOR "operator !=" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e != c ? : " << (e != c) << '\n'; std::cout << "e != d ? : " << (e != d) << '\n'; // "+" std::cout << "\n" COLOR "operator +" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = c + d : " << (e = c + d) << "\n"; std::cout << "e = e + c + d : " << (e = e + c + d) << '\n'; // "-" std::cout << "\n" COLOR "operator -" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = d - e ? : " << (e = d - e) << "\n"; std::cout << "e = c - d - e ? : " << (e = c - d - e) << '\n'; // "*" Fixed f; std::cout << "\n" COLOR "operator *" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = d * c ? : " << (e = d * c) << "\n"; std::cout << "e = d * c * c ? : " << (e = d * c * c) << '\n'; f = Fixed(3.5f); e = Fixed(5.25f); - std::cout << "f:" << f << " e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "f:" << f << " e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = f * e ? : " << (e = f * e) << "\n"; f = Fixed(1000); e = Fixed(50); - std::cout << "f:" << f << " e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "f:" << f << " e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = f * e ? : " << (e = f * e) << "\n"; f = Fixed(178481); // 8 388 607 / 47 = 178 481 e = Fixed(47); - std::cout << "f:" << f << " e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "f:" << f << " e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = f * e ? : " << (e = f * e) << "\n"; // "/" std::cout << "\n" COLOR "operator /" RESET "\n"; - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "e = d / c ? : " << (e = d / c) << "\n"; + std::cout << "e = c / d ? : " << (e = c / d) << "\n"; std::cout << "e = d / c / e ? : " << (e = d / c / e) << '\n'; + c = Fixed(6); + d = Fixed(10); + std::cout << COLOR2 "e:" << e << " c:" << c << " d:" << d << RESET "\n"; + std::cout << "e = c / d ? : " << (e = c / d) << '\n'; // "+ - * /" std::cout << "\n" COLOR "operator + - * /" RESET "\n"; Fixed g; - std::cout << "f:" << f << " e:" << e << " c:" << c << " d:" << d << '\n'; + std::cout << COLOR2 "f:" << f << " e:" << e << " c:" << c << " d:" << d << RESET "\n"; std::cout << "f = e + d / c - d / e * c ? : " << (f = e + d / c - d / e * c) << '\n'; std::cout << "g = d / c ? : " << std::setw(5) << std::left << (g = d / c) << "[f:" << std::setw(5) << std::left << f << " g:" << std::setw(5) << std::left << g << " e:" << e << " c:" << c << " d:" << d << "]\n"; std::cout << "g = e + g ? : " << std::setw(5) << std::left << (g = e + g) << "[f:" << std::setw(5) << std::left << f << " g:" << std::setw(5) << std::left << g << " e:" << e << " c:" << c << " d:" << d << "]\n"; std::cout << "f = d / e ? : " << std::setw(5) << std::left << (f = d / e) << "[f:" << std::setw(5) << std::left << f << " g:" << std::setw(5) << std::left << g << " e:" << e << " c:" << c << " d:" << d << "]\n"; std::cout << "f = f * c ? : " << std::setw(5) << std::left << (f = f * c) << "[f:" << std::setw(5) << std::left << f << " g:" << std::setw(5) << std::left << g << " e:" << e << " c:" << c << " d:" << d << "]\n"; std::cout << "f = g - f ? : " << std::setw(5) << std::left << (f = g - f) << "[f:" << std::setw(5) << std::left << f << " g:" << std::setw(5) << std::left << g << " e:" << e << " c:" << c << " d:" << d << "]\n"; - // "/" - std::cout << "\n" COLOR "operator /" RESET "\n"; - c = Fixed(6); - d = Fixed(10); - std::cout << "e:" << e << " c:" << c << " d:" << d << '\n'; - std::cout << "e = c / d ? : " << (e = c / d) << '\n'; // "++x" std::cout << "\n" COLOR "operator ++o" RESET "\n"; e = Fixed(2); std::cout << "e : " << e << '\n'; + std::cout << COLOR2 "e:" << e << RESET "\n"; std::cout << "++e : " << ++e << " ; e : " << e << '\n'; // "--x" std::cout << "\n" COLOR "operator --o" RESET "\n"; std::cout << "e : " << e << '\n'; + std::cout << COLOR2 "e:" << e << RESET "\n"; std::cout << "--e : " << --e << " ; e : " << e << '\n'; // "x++" std::cout << "\n" COLOR "operator o++" RESET "\n"; std::cout << "e : " << e << '\n'; + std::cout << COLOR2 "e:" << e << RESET "\n"; std::cout << "e++ : " << e++ << " ; e : " << e << '\n'; // "x--" std::cout << "\n" COLOR "operator o--" RESET "\n"; std::cout << "e : " << e << '\n'; + std::cout << COLOR2 "e:" << e << RESET "\n"; std::cout << "e-- : " << e-- << " ; e : " << e << '\n'; return 0; diff --git a/d02/ex02/operators b/d02/ex02/operators index a700ad2616845320ecd0a519eb22e5d5d14cda32..51e3beb67e99be62615cb48f70a386a116e7dfb4 100755 GIT binary patch literal 44984 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 literal 45088 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⋙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 Sr#6o!-}GZ8A0ZGiW&azzCJ1`~