알고리즘과 언어/c++

c++ 마이너스 0 ?

nextcoder 2023. 1. 7. 19:03

 

c++ 에는 마이너스 0(negative zero)이 존재한다.

이는 positive zero와 일치한다.

if (0 == -0) // True

 

나를 당황시켰던 코드는 다음과 같다.

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    float x = -2;
    float y = 10;
    cout << round(x / y) << endl;
}

output :

negative zero는 positive zero와 일치하기 때문에 평상시에는 따로 신경쓰지 않아도 되지만, 출력하는 상황이라면 주의해야한다.

특히 출력 문구로 Pass/Fail을 결정하는 알고리즘 테스트의 경우에는..!!

float 값을 통한 연산을 할 때, -0가 나올 수 있음을 염두해야 한다.

절대값을 return하는 abs를 이용하거나 0.0을 더해주는 방식으로 피할 수 있다.

    cout << abs(round(x / y)) << endl;
    cout << round(x / y) + 0.0 << endl;
    // output : 0

 

그런데 또 abs 함수의 헤더도 희한하다.

int 타입의 정수 절대값 함수(abs)의 오버로딩은 <cstdlib>에 존재하고,
float, double 타입의 실수 절대값 함수(abs)의 오버로딩은 <cmath>에 존재합니다.

 

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int x = -5;
    int y = -5.0;

    cout << abs(x) << endl;
    cout << abs(y) << endl;
}
//output : 5
//         5

그런데 cmath로 정수도 절대값 반환이 되는 것을 확인했다.