반응형
밑에 부분을 보기 전 공부해야할
1. 이진 기수법
https://wo-dbs.tistory.com/141
2. 고정소수점과 부동소수점
https://wo-dbs.tistory.com/142
3. 입출력 오버라이딩
https://wo-dbs.tistory.com/138
main.cpp
#include "Fixed.hpp"
int main( void ) {
Fixed a;
Fixed const b( 10 );
Fixed const c( 42.42f );
Fixed const d( b );
a = Fixed( 1234.4321f );
std::cout << "a is " << a << std::endl;
std::cout << "b is " << b << std::endl;
std::cout << "c is " << c << std::endl;
std::cout << "d is " << d << std::endl;
std::cout << "a is " << a.toInt() << " as integer" << std::endl;
std::cout << "b is " << b.toInt() << " as integer" << std::endl;
std::cout << "c is " << c.toInt() << " as integer" << std::endl;
std::cout << "d is " << d.toInt() << " as integer" << std::endl;
return 0;
}
fixed.cpp
#include "Fixed.hpp"
Fixed::Fixed(void)
{
std::cout << "Default constructor called" << std::endl;
this->number = 0;
}
Fixed::Fixed(const Fixed &obj)
{
std::cout << "Copy constructor called" << std::endl;
*this = obj;
}
Fixed::Fixed(int num)
{
std::cout << "Int constructor called" << std::endl;
this->number = num << this->bits;
}
Fixed::Fixed(const float num)
{
std::cout << "Float constructor called" << std::endl;
this->number = roundf(num * (1 << this->bits));
}
float Fixed::toFloat(void) const
{
return ((float)this->number / (1 << this->bits));
}
int Fixed::toInt(void) const
{
return (this->number >> this->bits);
}
std::ostream &operator<<(std::ostream &out, const Fixed &obj)
{
out << obj.toFloat();
return (out);
}
Fixed& Fixed::operator=(const Fixed &obj)
{
std::cout << "Copy assignment operator called" << std::endl;
if (this == &obj)
return *this;
this->number = obj.getRawBits();
return *this;
}
Fixed::~Fixed(void)
{
std::cout << "Destructor called" << std::endl;
}
int Fixed::getRawBits(void) const
{
return (this->number);
}
void Fixed::setRawBits(int const raw)
{
this->number = raw;
}
쉬프트 연산을 공부했는데 코드에서 “num * (1 << 8{this→bits})” 이런 것이 있을 것이다.
- 이짓을 하는 이유?
- 뒤에 소수부를 남겨놓기 위해 (고정소수점 방식임)
- 64비트 체계에서 int형은 32비트인데 그 안에서 num이 차지하고 있는 비트에서 8비트를 앞으로 땡기는 것임.
- 만약 8비트 체계에서는 1 << 8하면 값은 0
그 이후 roundf를 한다
- 이 짓을 하는 이유?
- 만약 num이 42.42가 들어오고 1<< 8 한 값 42.42 * 256이 되는데 10859.52가 나오는데 고정소수점으로 했을 때 이 값을 완벽하게 저장하지 못함.
- 반올림을 해서 그 값에 제일 접근하게 함.
roundf
반응형
'42Seoul > CPP Module 02' 카테고리의 다른 글
ex02(비교, 산술, 증감 연산자 오버로딩) (1) | 2024.01.24 |
---|---|
ex00 (0) | 2023.12.02 |