더북(TheBook)

그러나 리터럴의 타입에 주목해야 하는 이유는 크게 세 가지가 있다.

유용함: 표준 라이브러리는 복소수를 위한 타입을 제공한다. 여기서 실수부와 허수부의 타입은 사용자가 매개변수화할 수 있다.

std::complex<float> z(1.3, 2.4), z2;

불행하게도 타입 자체와 기본 실수 타입 사이의 연산만 지원한다(그리고 인수들은 여기서 변환되지 않는다).* 결과적으로 zintdouble과 곱할 수는 없고 float만 곱할 수 있다.

z2 = 2 * z;      // 오류: int * complex<float>이 없음
z2 = 2.0 * z;    // 오류: double * complex<float>이 없음
z2 = 2.0f * z;   // 정상: float * complex<float>이 있음

애매모호함: 함수를 서로 다른 인수 타입으로 오버로딩했을 때(1.5.4절 참조), 0과 같은 인수는 애매모호 할 수 있지만, 0u와 같이 한정된 인수는 정확하게 일치하는 타입이 있다.

정확함: 정확도 문제는 long double 타입으로 작업할 경우 발생한다. 한정되지 않은 리터럴은 double 타입이기 때문에 long double 타입 변수로 할당하기 전에 자릿수를 잃어버릴 수 있다.

long double third1 = 0.3333333333333333333;  // 자릿수를 잃어버릴 것이다.
long double third2 = 0.3333333333333333333l;  // 정확하다.

 

그러나 [18]에 설명되어 있듯이 혼합된 산술 연산은 구현 가능하다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.