본문 바로가기

C

c++ float 조심할 점

float은 정확한 값이 아니라 근사값이다.

예를 들어서 0.7f 가 정확한 0.7이 아니라 0.6999931414 이런 숫자일 수 있다.

따라서 == < 같은 comparision

더하기 연산 등을 매우 조심해야 한다.

 

코드 >>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <limits>
#include <cmath>
#include <iomanip>
 
// float에서는 == < 같은 comparision을 잘 쓰면 안 된다.
// + - 등 연산도 조심하자
// double은 정밀하다. 그렇다고 100% 정확한 것은 아님
 
 
// 단점 : 큰 값이 들어오면 잘 안된다
bool almostEqual1(float a, float b)
{
    const float diff = std::abs(a - b);
    return diff < 0.0001f;
}
 
bool almostEqual2(float x, float y, int ulp)
{
    const float diff = std::fabs(x - y);
    return diff <= std::numeric_limits<float>::epsilon() * std::fabs(x + y) * ulp
        || diff < std::numeric_limits<float>::min();
}
 
int main()
{
    const float num1 = 0.3f;
    const float num2 = 0.4f;
    const float num3 = 0.7f;
    const float sum = num1 + num2;
 
    std::cout << std::setprecision(100<< num1 << std::endl;
    std::cout << std::setprecision(100<< num2 << std::endl;
    std::cout << std::setprecision(100<< num3 << std::endl;
    std::cout << std::setprecision(100<< sum << std::endl;
 
    if (0.7f == sum)
    {
        std::cout << "A" << std::endl;
    }
    else
    {
        std::cout << "B" << std::endl;
    }
    
    if (almostEqual1(0.7f, sum))
        std::cout << "A" << std::endl;
    else
        std::cout << "B" << std::endl;
 
    if (almostEqual2(0.7f, sum, 1))
        std::cout << "A" << std::endl;
    else
        std::cout << "B" << std::endl;
    
    std::cout << std::numeric_limits<float>::epsilon() << std::endl;
    std::cout << std::numeric_limits<float>::min() << std::endl;
    
    return 0;
}

'C' 카테고리의 다른 글

c++ optional (C++17부터 지원)  (0) 2021.06.28
c++ tuple, pair  (0) 2021.06.28
c++ stl heap 기록  (0) 2021.06.28
c++ priority_queue  (0) 2021.06.28
c++ stack, Queue  (0) 2021.06.27