잔잔이네
article thumbnail
Published 2023. 6. 1. 14:29
[C++] 2.2 부동소수점 개발/C++

부동소수점 (floating point)

점(point)이 떠돌아다닌다(float)는 형태

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
    using namespace std;

    float f;
    double d;
    long double ld;

    cout << numeric_limits<float>::max() << endl;
    cout << numeric_limits<double>::max() << endl;
    cout << numeric_limits<long double>::max() << endl;

    return 0;
}

4, 8, 8 비트의 세가지 자료형이 있는데, #include <limits> 사용해서

numeric_limits<float>::lowest 최소 표현할 수 있는 범위가 나온다.

( min은 표현할 수 있는 최소 범위의 절댓값으로 표기됨. )


setprecision ( 소수점 표기 )

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
    using namespace std;

    cout << std::setprecision(16);
    cout << 1.0 / 3.0 << endl;

    return 0;
}

#include <iomanip> : 입출력을 manipulator가 조작한다.

 

cout << std::setprecision(16); 소수점을 몇자리까지 출력할지 가능하다. (16자리)


소수점 표기의 한계

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
    using namespace std;

    double d(0.1);

    cout << d << endl;
    cout << std::setprecision(17);
    cout << d << endl;

    return 0;
}

16자리를넘는 17자리로 출력하면 0.1에 가장 근접한 수를 표현함. (한계가 있다.)


숫자가 아닌 수 ( 0으로 나누어보기 )

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
    using namespace std;

    double zero = 0.0;
    double posinf = 5.0 / zero;
    double neginf = -5.0 / zero;
    double nan = zero / zero;

    cout << posinf << endl;
    cout << neginf << endl;
    cout << nan << endl;

    return 0;
}

0으로 나눌 경우 positive infinite, negative infinite  0을 0으로 나눌 경우 not a number(indeterminate)가 나오는데

 

디버깅

#include <iostream>
#include <iomanip>
#include <limits>
#include <cmath>

int main()
{
    using namespace std;

    double zero = 0.0;
    double posinf = 5.0 / zero;
    double neginf = -5.0 / zero;
    double nan = zero / zero;

    cout << posinf << " " << std::isinf(posinf) << endl;
    cout << neginf << " " << std::isinf(neginf) << endl;
    cout << nan << " " << std::isnan(nan) << endl;
    cout << 1.0 << " " << std::isnan(1.0) << endl;

    return 0;
}

#include <cmath>헤더를 인클루드 해준후 std::isinf(), std::isnan()를 이용하여 참 혹은 거짓을 구별할 수 있게된다.

 

출력결과

 


 

profile

잔잔이네

@잔잔잔잔

🌈

검색 태그